![](/img/trans.png)
[英]Django ORM Accessing related many-to-many objects through queryset
[英]Django ORM: How to filter on many-to-many relation without filtering related objects
我有一些 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")
现在,我想 select 所有与“剧院”类型相关的电影,并获取所有相关类型的列表:
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'}
如何有效地将电影过滤到与“剧院”类型相关的电影并检索其相关类型?
对此的解决方案是查询 Genre,按之前返回的 Films 进行过滤:
In[23]: set(Genre.objects.filter(film__in=qs))
Out[23]:
{<Genre: Dance>,
<Genre: Education>,
<Genre: Theatre>,
<Genre: Video Recording>}
我想直接从原始查询访问该信息是不可能的,因为其他类型被用于 select 电影的WHERE
子句过滤掉了。
但是,如果使用prefetch_related('genre')
,这种方法似乎有点低效,因为它会导致执行两次相同的查询,一次用于prefetch_related('genre')
,一次用于上述应用程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.