【问题标题】:quickly access models attributes via foreign key relationship in django template通过django模板中的外键关系快速访问模型属性
【发布时间】: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>

【问题讨论】:

标签: django django-models django-views django-templates jinja2


【解决方案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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 2015-02-21
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 2023-03-23
    • 2019-07-03
    相关资源
    最近更新 更多