0

假设我们有两个这样的模型:

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_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" ...)

在这个例子中,查询集应该包含 object a1,因为 objects都b1b2它相关,并且都具有fooin的值some_field。(并且包含a2,因为它不满足第二个要求。)

我知道我可以使用.annotate(models.Count('b_models'))然后.filter(b_models__count__gte=2)从. 但在本例中,这将返回和。如何满足第二个要求并进一步过滤查询集?ModelAModelBa1a2

(或者有比我的annotate条款更好的整体方法吗?)

编辑:澄清一下,我不需要知道具体的价值是什么some_field。第二个要求很简单,ModelB实例的值相同some_field。所以如果我要添加

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

那么查询应该同时返回a1a2

4

1 回答 1

0

您可以尝试添加另一个过滤器,例如.filter(b_models__count__gte=2, b_models__some_field="foo")

于 2020-02-09T17:39:41.833 回答