Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django三重关系与选择/预取相关?_Django - Fatal编程技术网

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

Django三重关系与选择/预取相关?,django,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

我有以下型号:

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个连接

我如何优化它


注意:使用“预回迁相关”而不是“选择相关”不起作用。

您可以尝试“预回迁相关”选项:

Items.objects.all().prefetch_related('user')
这应该对数据库进行两次查询,然后在python中对用户及其项进行连接