我有以下模型:
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]
问题是每当项目。调用to_dict,在UserPref模型上有一个查询因为这行prefs = self.prefs.get()
如果我有20个条目,就会有21个查询,而不是1个,2个连接。
我如何优化这个?
注意:使用prefetch_related而不是select_related是行不通的
您可以尝试prefetch_related选项:
Items.objects.all().prefetch_related('user')
这应该对数据库执行两次查询,然后在User和它的项之间执行python连接。