【问题标题】:Calling foreign key object several times in Django without several DB requests在没有多个数据库请求的情况下,在 Django 中多次调用外键对象
【发布时间】:2018-10-13 14:57:38
【问题描述】:

假设我有一个类 Child 通过 FK 链接到另一个类 Parent。现在假设我有一段代码在模板中做这样的事情

<td>{{ child.parent.name }}</td>
<td>{{ child.parent.age}}</td>
<td>{{ child.parent.address }}</td>

我的第一个问题是,Django 会去数据库读取Parent 实体三遍吗?我的第二个问题是:如果是,不多次阅读的最佳做法是什么?我的意思是我知道我可以在此块之前声明一个对象并将其设置为等于child.parent,但是还有其他方法吗?

【问题讨论】:

标签: python django django-models django-database


【解决方案1】:

不,Django 只会访问一次 DB,下一次调用将使用缓存属性并且不需要访问 DB,您可以查看相关文档的 part

但是您可以使用select_related 方法来改善这一点,在这种情况下,即使是第一次调用也不会命中数据库,因为child.parent 将被预缓存。

【讨论】:

    【解决方案2】:

    使用select_related

    在您看来,像这样获取 Child 对象:

    children = Child.objects.select_related('parent').all()
    

    【讨论】:

      【解决方案3】:

      为了补充 neverwalkaloner 的答案,您还可以在模板中使用别名 child.parent 以避免查找成本:

      {% with parent=child.parent %}
      <td>{{ parent.name }}</td>
      <td>{{ parent.age}}</td>
      <td>{{ parent.address }}</td>
      {% endwith %}
      

      【讨论】:

        猜你喜欢
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        • 2020-04-24
        • 1970-01-01
        • 2014-05-14
        相关资源
        最近更新 更多