【发布时间】:2014-06-14 17:18:54
【问题描述】:
我有以下型号:
class User(models.Model):
...
@property
def to_dict():
prefs = self.prefs.get()
return {'id': self.pk, 'birthday': prefs.birthday}
class UserPref(models.Model):
user = models.ForeignKey(User, rel_class=models.OneToOneRel, related_name='prefs')
birthday = models.DateTimeField()
class Item(models.Model):
user = models.ForeignKey(User, related_name='items')
name = models.CharField()
@property
def to_dict():
return {'name': self.name, 'owner': self.user.to_dict}
我需要获取用户的所有项目,并在响应中包含用户偏好,如下所示:
items: [{
name: 'item 1',
owner: {
id: 1,
birthday: '11/11/1900'
}
}]
我的查询集如下:
items = Items.objects.all().select_related('user')
result = [item.to_dict for item in items]
问题在于,每当调用 item.to_dict 时,都会因为 prefs = self.prefs.get() 这一行对 UserPref 模型进行查询
因此,如果我有 20 个项目,则将有 21 个查询,而不是 1 个有 2 个连接的查询。
如何优化?
注意:使用 prefetch_related 代替 select_related 是行不通的。
【问题讨论】:
标签: django