假设我们有两个这样的模型:
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 = ...
...
如果我想获得一个查询集,该查询集只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" ...)
在这个例子中,查询集应该包含 object a1
,因为 objects都b1
与b2
它相关,并且都具有foo
in的值some_field
。(并且不包含a2
,因为它不满足第二个要求。)
我知道我可以使用.annotate(models.Count('b_models'))
然后.filter(b_models__count__gte=2)
从. 但在本例中,这将返回和。如何满足第二个要求并进一步过滤查询集?ModelA
ModelB
a1
a2
(或者有比我的annotate
条款更好的整体方法吗?)
编辑:澄清一下,我不需要知道具体的价值是什么some_field
。第二个要求很简单,ModelB
实例的值相同some_field
。所以如果我要添加
b6 = ModelB.objects.create(a=a2, some_field="baz" ...)
那么查询应该同时返回a1
和a2
。