首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django ORM:如何在不过滤相关对象的情况下过滤多对多关系

Django ORM:如何在不过滤相关对象的情况下过滤多对多关系
EN

Stack Overflow用户
提问于 2021-11-30 11:15:46
回答 1查看 30关注 0票数 0

我有一些Django模型,如下所示:

代码语言:javascript
复制
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“相关联的所有电影,并获得其所有相关类型的列表:

代码语言:javascript
复制
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'}

然而,这不是我想要的结果。查看作为查询集的一部分返回的第一部电影的类型,我们可以看到更多的类型:

代码语言:javascript
复制
In [4]: set(qs[0].genre.all().values_list("slug", flat=True))
Out[4]: {'dance', 'education', 'theatre', 'video-recording'}

如何有效地将影片过滤为与类型"Theatre“关联的影片并检索其关联的类型?

EN

回答 1

Stack Overflow用户

发布于 2021-11-30 11:59:57

一种解决方案是查询流派,根据之前返回的电影进行过滤:

代码语言:javascript
复制
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'),另一次是针对上述应用程序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70168428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档