繁体   English   中英

Django ORM:如何过滤多对多关系而不过滤相关对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM