【问题标题】:Django ORM - querying many to many through models?Django ORM - 通过模型查询多对多?
【发布时间】: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)

谢谢。

【问题讨论】:

    标签: python sql django


    【解决方案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 实例集的名称,因此将其称为galleries 或favorites 之类的名称将使一切都更清楚了。
    • @lucifer:顺便说一下,null=True 在 M2M 领域没有任何意义。请参阅我的回答 here 了解更多详情。
    猜你喜欢
    • 2019-08-13
    • 1970-01-01
    • 2012-01-12
    • 2020-08-04
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    相关资源
    最近更新 更多