与选择/预取相关的Django三重关系?

时间:2014-06-14 17:18:55

标签: django

我有以下型号:

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,都会在UserPref模型上进行查询,因为此行prefs = self.prefs.get()

因此,如果我有20个项目,则会有21个查询而不是1个有2个连接。

如何优化此功能?

注意:使用prefetch_related而不是select_related不起作用。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用prefetch_related选项:

Items.objects.all().prefetch_related('user')

这应该对数据库进行两次查询,然后在用户及其项目之间进行python连接。