通过django模板中的外键关系快速访问模型属性

Posted

技术标签:

【中文标题】通过django模板中的外键关系快速访问模型属性【英文标题】:quickly access models attributes via foreign key relationship in django template 【发布时间】:2020-09-29 01:20:54 【问题描述】:

我有一个模型,其中一个字段是 ForeignKey,因此每个子对象都链接到父对象。

在我的 (jinja2) 模板中,我列出了来自子模型的对象子集的一些属性,包括其中一个父属性。页面加载非常缓慢,所以我想知道是否有更快的方法来执行以下操作:

views.py

class TransactionView(LoginRequiredMixin, ListView):
    model = Transactions
    context_object_name = 'transaction_list'
    template_name = 'bank/transactions.html'

    def get_queryset(self):
        return Transactions.objects.filter(owner_id=self.request.user)

模板.html

            <tbody>
              % for transaction in transaction_list %
                <tr>
                  <td>transaction.source_document.service_provider</td>
                  <td>transaction.account</td>
                  <td>transaction.tnsx_date</td>
                  <td>transaction.end_bal</td>
                  <td>transaction.amount</td>
                  <td>transaction.category</td>
                </tr>
              % endfor %
            </tbody>

models.py

class Transactions(models.Model):
    def __str__(self):
        return str(self.tnsx_uuid)

    owner = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        db_index=True,
        editable=True,
    )
    source_document = models.ForeignKey(
        Document,
        on_delete=models.CASCADE,
        editable=True,
    )
    tnsx_uuid = models.UUIDField(default=uuid.uuid4, unique=True)
    account = IBANField(enforce_database_constraint=True)
    currency = models.CharField(max_length=4, blank=False, null=False)
    currency_assumed = models.BooleanField(null=False)
    <etc>

【问题讨论】:

docs.djangoproject.com/en/3.0/topics/db/optimization docs.djangoproject.com/en/3.0/ref/models/querysets/… docs.djangoproject.com/en/3.0/ref/models/querysets/… 【参考方案1】:

正如 iklinac 建议的那样,使用 .prefetch_related() 可以显着提高查询速度。

views.py 更改为以下内容:

class TransactionView(LoginRequiredMixin, ListView):
    model = Transactions
    context_object_name = 'transaction_list'
    template_name = 'bank/transactions.html'

    def get_queryset(self):
        return Transactions.objects.filter(owner_id=self.request.user).prefetch_related('source_document')

【讨论】:

以上是关于通过django模板中的外键关系快速访问模型属性的主要内容,如果未能解决你的问题,请参考以下文章

姜戈。从表单对象访问模板中的外键字段

Django模型加入一对多关系以在模板中显示

如何从 Django 模板中的外键访问值

通过不同的外键进行循环迭代的 Django 模板

使用 django 查询集访问不同的外键关系

如何在 html 模板中显示 nut、date 字段?如何访问 html 模板中的外键字段?