首页 > 解决方案 > 通过django模板中的外键关系快速访问模型属性

问题描述

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

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

视图.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>

模型.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>

标签: djangodjango-modelsdjango-viewsdjango-templatesjinja2

解决方案


正如 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')

推荐阅读