如何 filter/annotate 在 django 中预取对象(更有效)?

How to filter/annotate prefetched objects in django (more efficiently)?

我想用 prefetch_related 个对象过滤查询集。这段代码有效,但我想更有效地编写它。你有什么想法吗?

queryset = Song.objects.prefetch_related(
                Prefetch('harmonies', queryset=Harmony.objects.filter(someQuery)))

for s in queryset:
    if s.harmonies.count() > 0:
         songs.append(s.id)
queryset = queryset.filter(id__in=songs)

我试过类似的方法,但没有用。

queryset = queryset.annotate(h_count=Count('harmonies')).exclude(h_count=0)

谢谢你的帮助。

您可以使用 Exists subquery [Django-doc],因此:

from django.db.models import Exists, OuterRef

queryset = Song.objects.filter(
    <b>Exists(</b>Harmony.objects.filter(someQuery<b>, song_id=OuterRef('pk')</b>)<b>)</b>
)

这里的song_id=…是从HarmonysongForeignKey,所以可能略有不同。