首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让Django的多个管理器同时匹配多个关系?

如何让Django的多个管理器同时匹配多个关系?
EN

Stack Overflow用户
提问于 2011-09-19 19:15:35
回答 1查看 540关注 0票数 8

我有这个模型:

代码语言:javascript
复制
class Movie(models.Model):
    # I use taggit for tag management
    tags = taggit.managers.TaggableManager()

class Person(models.Model):
    # manytomany with a intermediary model
    movies = models.ManyToManyField(Movie, through='Activity')

class Activity(models.Model):
    movie = models.ForeignKey(Movie)
    person = models.ForeignKey(Person)
    name = models.CharField(max_length=30, default='actor')

我想匹配一部演员和另一部电影演员相同的电影。Not one actor in common, but all the actors in common

所以我不想这样:

代码语言:javascript
复制
# actors is a shortcut property
one_actor_in_common = Movie.object.filter(activities__name='actor', 
                                           team_members__in=self.movie.actors)

我想要一些能让“黑客帝国I”和“黑客帝国II”匹配的东西,因为他们共享“基努里维斯”和“劳伦斯菲什伯恩”,但不能匹配“速度”,因为他们共享“基努里维斯”而不是“劳伦斯菲什伯恩”。

EN

回答 1

Stack Overflow用户

发布于 2012-01-05 20:46:03

多对多的管理器不能同时匹配多个关系。在数据库级别,这一切都归结为选择和分组。

因此,自然地说,数据库能够回答的唯一问题是:列出涉及这些人的表演活动,按电影对它们进行分组,并仅显示那些具有与人相同数量的表演活动的电影。

翻译成ORM语言,它看起来像这样:

代码语言:javascript
复制
actors = Person.objects.filter(name__in=('Keanu Reaves', 'Laurence Fishburne'))

qs = Movie.objects.filter(activity__name='actor',
                          activity__person__in=actors)
qs = qs.annotate(common_actors=Count('activity'))
all_actors_in_common = qs.filter(common_actors=actors.count())

这样产生的查询实际上还不错:

代码语言:javascript
复制
SELECT "cmdb_movie"."id", "cmdb_movie"."title", COUNT("cmdb_activity"."id") AS "common_actors" 
    FROM "cmdb_movie" 
    LEFT OUTER JOIN "cmdb_activity" ON ("cmdb_movie"."id" = "cmdb_activity"."movie_id") 
    WHERE ("cmdb_activity"."person_id" IN (SELECT U0."id" FROM "cmdb_person" U0 WHERE U0."name" IN ('Keanu Reaves', 'Laurence Fishburne')) 
           AND "cmdb_activity"."name" = 'actor' )
    GROUP BY "cmdb_movie"."id", "cmdb_movie"."title", "cmdb_movie"."id", "cmdb_movie"."title" 
    HAVING COUNT("cmdb_activity"."id") = 2

我还有一个小应用程序,我用它来测试它,但我不知道是否有人需要它,也不知道在哪里托管它。

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

https://stackoverflow.com/questions/7470071

复制
相关文章

相似问题

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