【问题标题】:Filter django queryset: Query objects with two or more reverse-related objects with a certain identical field valuefilter django queryset:查询对象有两个或多个具有某个相同字段值的反向相关对象
【发布时间】: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,因为对象b1b2都与它相关并且some_field中都具有foo的值。 (并且包含a2,因为它不满足第二个要求。)

我知道我可以使用.annotate(models.Count('b_models')).filter(b_models__count__gte=2)ModelB 获取具有两个或多个反向关系的ModelA 实例。但在本例中,这将返回 a1a2。如何满足第二个要求并进一步过滤查询集?

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

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

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

那么查询应该返回a1a2

【问题讨论】:

    标签: python django django-queryset django-aggregation django-related-manager


    【解决方案1】:

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

    【讨论】:

    • 不,我不是在寻找针对特定情况的解决方案,其中some_field="foo"。那将是微不足道的。我只关心具有相同some_field 和值的对象(并且具有相同ModelA 实例的ForeignKey)。我不知道也不想知道具体的值是什么。
    猜你喜欢
    • 1970-01-01
    • 2020-06-16
    • 2021-04-01
    • 2011-09-15
    • 2018-05-22
    • 1970-01-01
    • 2013-05-18
    • 2019-06-19
    • 1970-01-01
    相关资源
    最近更新 更多