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
实例集的名称,因此将其称为galleries
或favorites
之类的名称将使一切都更清楚了。
@lucifer:顺便说一下,null=True
在 M2M 领域没有任何意义。请参阅我的回答 here 了解更多详情。以上是关于Django ORM - 通过模型查询多对多?的主要内容,如果未能解决你的问题,请参考以下文章
Python学习第135天(Django的ORM多对多查询)