我有一些Django模型,如下所示:
class Film:
genre = models.ManyToManyField("Genre", blank=True)
class Genre(TimeStampedModel):
name = models.CharField(max_length=50, blank=False)
slug = AutoSlugField(max_length=55, unique=True, populate_from="name")现在,我想选择与类型"Theatre“相关联的所有电影,并获得其所有相关类型的列表:
In [1]: from apps.base.models import Film, Genre
In [2]: qs = Film.objects.filter(genre__slug='theatre')
In [3]: set(qs.values_list("genre__slug", flat=True))
Out[3]: {'theatre'}然而,这不是我想要的结果。查看作为查询集的一部分返回的第一部电影的类型,我们可以看到更多的类型:
In [4]: set(qs[0].genre.all().values_list("slug", flat=True))
Out[4]: {'dance', 'education', 'theatre', 'video-recording'}如何有效地将影片过滤为与类型"Theatre“关联的影片并检索其关联的类型?
发布于 2021-11-30 11:59:57
一种解决方案是查询流派,根据之前返回的电影进行过滤:
In[23]: set(Genre.objects.filter(film__in=qs))
Out[23]:
{<Genre: Dance>,
<Genre: Education>,
<Genre: Theatre>,
<Genre: Video Recording>}我猜直接从原始查询中访问该信息是不可能的,因为其他类型被用于选择电影的WHERE子句过滤掉了。
然而,如果使用prefetch_related('genre'),这种方法似乎有点低效,因为它将导致相同的查询被执行两次,一次是针对prefetch_related('genre'),另一次是针对上述应用程序。
https://stackoverflow.com/questions/70168428
复制相似问题