django - 通过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>
解决方案
正如 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')
推荐阅读
- python - 替换列中零百分比的零小于 50
- security - API 网关与微服务端点中的授权
- thymeleaf - 无法在 thymeleaf th:each 中传递模型属性
- java - JUnit Java Instant 依赖测试
- javascript - 具有 Azure AD B2C 授权的 API 的 fetch() 方法示例
- c++ - 将对象存储在多个 shared_ptr 列表中
- html - Contact Form 7 (wordpress) 中的评论部分在移动设备上不起作用
- ios - 如何检测iOS中是否按下了某个键?
- c++ - 检测 keyPressEvent 上的插入符号 ( ^ ) 键 - Qt C++
- api - Eventbrite API 列表事件 403