【问题标题】:Filter Django objects where related object exists过滤存在相关对象的 Django 对象
【发布时间】:2012-11-29 12:38:46
【问题描述】:

这肯定是一个重复的问题,但我找不到其他问题。我正在尝试获取有投诉的照片列表。我不能简单地收到投诉并处理相关照片 - 我需要照片查询集。

这应该可行,但似乎不对:

Photo.objects.filter(complaint__id__gte=0)

这似乎不是最有效的方法:

Photo.objects.annotate(Count('complaint')).exclude(complaint__count=0)

有没有更好的办法?

【问题讨论】:

    标签: django


    【解决方案1】:

    怎么样...

    Photo.objects.filter(complaint__isnull=False)

    来自https://docs.djangoproject.com/en/dev/topics/db/queries/

    【讨论】:

    • 您可能还需要一个 .distinct() 最后来复制与注释相同的内容。至少我做到了。
    • @Christoffer 你救了我的命,谢谢。这是一个致命的问题,所以我想写一个评论并提高重点。
    【解决方案2】:

    我不确定哪种变体最好,但也可以。

    Photo.objects.exclude(complaint=None)

    此处生成的 SQL 查询与 .filter(complaint__isnull=False) 的情况不同,但意义相同。

    【讨论】:

    • 这比公认的答案要好,因为它不需要.distinct() 调用来处理多值关系。
    • 这个答案在使用 Q 对象时也有效。此代码有效:Q(related_object=None) 是否无效:Q(related_object__is_null=True)
    • 这更短但也更慢。
    • @ezdookie 我在本地测试过(50k行),速度差不多,相差5%左右。
    猜你喜欢
    • 2010-09-20
    • 2019-02-14
    • 2018-11-18
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多