【问题标题】:Django triple relation with select/prefetch related?Django 三重关系与选择/预取相关?
【发布时间】: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


    【解决方案1】:

    你可以试试 prefetch_related 选项:

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

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

    【讨论】:

      猜你喜欢
      • 2020-05-09
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多