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

vcudknz3  于 2023-06-25  发布在  Go
关注(0)|答案(3)|浏览(162)

这肯定是一个重复的问题,但我找不到其他问题。我想找一份有投诉的照片清单。我不能简单地得到投诉和处理相关的照片-我需要一个queryset的照片。
这应该可以工作,但似乎不正确:

Photo.objects.filter(complaint__id__gte=0)

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

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

有更好的办法吗?

agxfikkp

agxfikkp1#

不如...
Photo.objects.filter(complaint__isnull=False)
https://docs.djangoproject.com/en/dev/topics/db/queries/

gk7wooem

gk7wooem2#

我不知道哪一个版本是最好的,但它也很好用。
Photo.objects.exclude(complaint=None)
生成的SQL查询与.filter(complaint__isnull=False)的情况不完全相同,但意义相同。

7vux5j2d

7vux5j2d3#

根据关系和过滤器逻辑的复杂性,您可能需要这个 (或者这个可能会变得更易读)

complaints = Complaint.objects.filter(
    # some complex filter here
   Q(...) & Q(...) | Q(...)
)

Photo.objects.annotate(
    has_complaints=Exists(complaints)
).filter(has_complaints=True)

相关问题