如何 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=…
是从Harmony
到song
的ForeignKey
,所以可能略有不同。
我想用 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=…
是从Harmony
到song
的ForeignKey
,所以可能略有不同。