django - 如何要求 Django 多关系管理器同时匹配多个关系?

标签 django orm many-to-many

我有这个模型:

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')

我想匹配一部与另一部电影具有相同 Actor 的电影。 不是一个共同的 Actor ,而是所有的 Actor 都有共同的

所以我不想要这个:

# actors is a shortcut property
one_actor_in_common = Movie.object.filter(activities__name='actor', 
                                           team_members__in=self.movie.actors)

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

最佳答案

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

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

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

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())

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

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

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

关于django - 如何要求 Django 多关系管理器同时匹配多个关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7470071/

相关文章:

python - 如何在 django 中用 group by 对两列进行乘法和求和

django - django错误邮件: html format as debug = ture

java - 为什么我的集合初始化不起作用?

javascript - 使用 redux-orm 引导多对多关系

mysql - Zend_db 联表连接查询

grails - Grails “Cannot set readonly property”

python - 使用 django 模板确定我是否需要在 HTML 中引用

python - 如何使Django sqlclear输出依赖关系的CASCADE

java - Spring MVC 应用程序语法错误

java - merge() 操作中丢失复合外键 (JPA/Hibernate)