【发布时间】:2020-05-25 02:30:03
【问题描述】:
假设我们有两个这样的模型:
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" ...)
在这个例子中,查询集应该包含对象a1,因为对象b1和b2都与它相关并且在some_field中都具有foo的值。 (并且不包含a2,因为它不满足第二个要求。)
我知道我可以使用.annotate(models.Count('b_models')) 和.filter(b_models__count__gte=2) 从ModelB 获取具有两个或多个反向关系的ModelA 实例。但在本例中,这将返回 a1 和 a2。如何满足第二个要求并进一步过滤查询集?
(或者有比我的annotate 子句更好的整体方法吗?)
编辑:澄清一下,我不需要知道some_field 的具体值是什么。第二个要求很简单,ModelB 实例对于some_field 的值相同。所以如果我要添加
b6 = ModelB.objects.create(a=a2, some_field="baz" ...)
那么查询应该返回a1 和a2。
【问题讨论】:
标签: python django django-queryset django-aggregation django-related-manager