次のような 2 つのモデルがあるとします。
from django.db import models
ModelA(models.Model):
...
ModelB(models.Model):
a = models.ForeignKey(ModelA, ..., related_name='b_models')
some_field = models.CharField(...)
other_field = ...
...
に対して同じ値を持つ2 つ以上のオブジェクトを指しているオブジェクトのみModelA
を含むクエリセットを取得したい場合はどうすればよいですか? b_models
some_field
次の設定例を検討してください。
a1, a2 = ModelA.objects.create(...), ModelA.objects.create(...)
b1 = ModelB.objects.create(a=a1, some_field="foo" ...)
b2 = ModelB.objects.create(a=a1, some_field="foo" ...)
b3 = ModelB.objects.create(a=a1, some_field="bar" ...)
b4 = ModelB.objects.create(a=a2, some_field="baz" ...)
b5 = ModelB.objects.create(a=a2, some_field="foo" ...)
この例では、a1
オブジェクトb1
とb2
両方がそれに関連しており、両方に値があるfoo
ため、クエリセットにはオブジェクトが含まれている必要がありますsome_field
。( 2 番目の要件を満たさないため、 は含まれません。 )a2
.annotate(models.Count('b_models'))
と を使用して、から2 つ以上の逆の関係を持つ.filter(b_models__count__gte=2)
のインスタンスを取得できることを知っています。ただし、この例では、 と の両方が返されます。2 番目の要件を満たし、クエリセットをさらにフィルタリングするにはどうすればよいですか?ModelA
ModelB
a1
a2
annotate
(または、私の条項よりも優れた全体的なアプローチはありますか?)
編集:明確にするために、特定の値がどうなるかを知る必要はありません。2 番目の要件は単純に、インスタンスの の値が同一であることです。だから私が追加するならsome_field
ModelB
some_field
b6 = ModelB.objects.create(a=a2, some_field="baz" ...)
クエリは と の両方a1
を返す必要がありますa2
。