通过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模板中的外键关系快速访问模型属性的主要内容,如果未能解决你的问题,请参考以下文章