【发布时间】:2012-02-04 09:29:22
【问题描述】:
假设我有以下模型:
class Thing(models.Model):
name = models.CharField(max_length=100)
ratings = models.ManyToManyField('auth.User', through='Rating')
class Rating(models.Model):
user = models.ForeignKey('auth.User')
thing = models.ForeignKey('Thing')
rating = models.IntegerField()
所以我有很多东西,每个用户都可以评价每件事。我还有一个视图显示所有事物的列表(它们的数量很大)以及用户分配给每个事物的评级。我需要一种从数据库中检索所有数据的方法:具有附加字段 user_rating 的事物对象最多取自一个(因为我们有一个固定的用户)相关的评级对象。
简单的解决方案如下所示:
things = Thing.objects.all()
for thing in things:
try:
thing.user_rating = thing.ratings.objects.get(user=request.user).rating
except Rating.DoesNotExist:
thing.user_rating = None
但是这种方法的缺陷很明显:如果我们有 500 个东西,我们将对数据库发出 501 个请求。每页。每个用户。这是该网站浏览次数最多的页面。这个任务很容易用 SQL JOIN 解决,但实际上我有更复杂的模式,我肯定会从 Django 模型框架中受益。所以问题是:有可能以 Django 方式进行吗?考虑到这样的任务很常见,如果不是这样就真的很奇怪了。
据我了解,annotate() 和 select_related() 都不会在这里帮助我。
【问题讨论】:
标签: django model many-to-many