过滤存在相关对象的Django对象

Jak*_*ake 35 django

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

这应该工作,但似乎不对:

Photo.objects.filter(complaint__id__gte=0)
Run Code Online (Sandbox Code Playgroud)

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

Photo.objects.annotate(Count('complaint')).exclude(complaint__count=0)
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

jcf*_*wer 66

怎么样 ...

Photo.objects.filter(complaint__isnull=False)

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

  • 您最后可能还需要.distinct()来复制与annotate相同的内容.至少我做到了. (18认同)
  • @Christoffer你救了我的命,谢谢.这是一个致命的问题,所以我想写一个评论并改进重点. (3认同)

Mar*_*hyn 11

我不确定哪种变体是最好的,但也可以.

Photo.objects.exclude(complaint=None)

这里生成的SQL查询与情况不同.filter(complaint__isnull=False),但感觉是相同的.

  • 这比接受的答案要好,因为它不需要`.distinct()` 调用来处理多值关系。 (2认同)