Django ORM - 通过模型查询多对多?

Posted

技术标签:

【中文标题】Django ORM - 通过模型查询多对多?【英文标题】:Django ORM - querying many to many through models? 【发布时间】:2014-05-27 04:56:12 【问题描述】:

所以我正在尝试在 Django 中实现一个用户收藏夹系统。我需要存储收藏 Gallery 对象的时间,所以我使用 Django 的 many to many through 模式。正如您在下面看到的,我有一个 Gallery 对象,它与收藏它的用户具有多对多关系,而 Favorite 对象与 User 和 Gallery 具有多对一关系。我想做一些事情,比如显示一个包含所有用户收藏夹的页面,查询用户收藏夹以查看某个画廊是否在其中,等等。所以基本上能够获得某个用户收藏的画廊。使用 ORM 执行此操作的最简单方法是什么,或者我需要为此编写原始 SQL 吗?

class Gallery(models.Model):
    favoriters = models.ManyToManyField(
    User, through='Favorite', null=True, related_name="favoriters")

    def __unicode__(self):
        return self.name        

class Favorite(models.Model):
    user = models.ForeignKey(User)
    gallery = models.ForeignKey(Gallery)
    date = models.DateField(auto_now_add=True)

谢谢。

【问题讨论】:

【参考方案1】:

您可以使用 Django ORM 轻松完成此操作。

显示一个包含所有用户收藏的页面

user.favoriters.all()  # though that is not a good related_name

查询用户的收藏夹以查看某个图库是否在其中

if user.favoriters.filter(pk=my_gallery.pk).exists():
    pass

更多示例请参见the documentation。

【讨论】:

谢谢,看来可以了。我对该领域的用途感到困惑。 @lucifer:因为这是您从给定的User 实例中获取Gallery 实例集的名称,因此将其称为galleriesfavorites 之类的名称将使一切都更清楚了。 @lucifer:顺便说一下,null=True 在 M2M 领域没有任何意义。请参阅我的回答 here 了解更多详情。

以上是关于Django ORM - 通过模型查询多对多?的主要内容,如果未能解决你的问题,请参考以下文章

Django ORM 查询更新反向多对多字段

Django ORM:优化涉及多对多关系的查询

Python学习第135天(Django的ORM多对多查询)

Django 补充ORM多对多正向查询

django ORM 一对多, 多对多 查询 以及 结合Tamplate

15)django-ORM(多对多)