0

次のような 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_modelssome_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オブジェクトb1b2両方がそれに関連しており、両方に値があるfooため、クエリセットにはオブジェクトが含まれている必要がありますsome_field。( 2 番目の要件を満たさないため、 は含まれません )a2

.annotate(models.Count('b_models'))と を使用して、から2 つ以上の逆の関係を持つ.filter(b_models__count__gte=2)のインスタンスを取得できることを知っています。ただし、この例では、 と の両方が返されます。2 番目の要件を満たし、クエリセットをさらにフィルタリングするにはどうすればよいですか?ModelAModelBa1a2

annotate(または、私の条項よりも優れた全体的なアプローチはありますか?)

編集:明確にするために、特定の値どうなるかを知る必要はありません。2 番目の要件は単純に、インスタンスの の値が同一であることです。だから私が追加するならsome_fieldModelBsome_field

b6 = ModelB.objects.create(a=a2, some_field="baz" ...)

クエリは と の両方a1を返す必要がありますa2

4

1 に答える 1