django - Django - prefetch_related 的使用
问题描述
无论我阅读了多少教程/文档,我仍然不太了解我应该如何使用 prefetch_related。
我的模型.py:
class ProfileComment(models.Model):
author = models.ForeignKey('Profile', on_delete=models.CASCADE, null=True)
date_posted = models.DateTimeField(default=timezone.now, editable=False)
body = models.CharField(max_length=180, blank=True)
...
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
comments = models.ManyToManyField(ProfileComment, related_name='comments', blank=True)
avatar = models.FileField(upload_to=avatar_folder, default='user-avatar/default.png')
...
我的意见.py:
profile = Profile.objects.prefetch_related('comments').get(user=request.user)
在模板中:
{% for comment in profile.comments.all %}
<div>
<p>Author: {{ comment.author.user }}</p><img src="{{ comment.author.avatar.url }}">
<p>Message: {{ comment.body }}</p>
<p>Date posted: {{ comment.date_posted }}</p>
</div>
{% endfor %}
但是,无论我在 prefetch_related 中输入什么,每条记录的查询量都会增加 5
解决方案
.prefetch_related(…)
[Django-doc]应该用于批量获取查询集的相关对象。既然你写:
….get(user=request.user)
但是它不会有任何区别,因为您只检索一个对象,因此它将在额外的查询中预取注释。
但是,您可以最小化的是源自comment.author.user
. 这将使每个评论产生两个额外的查询,因为ForeignKey
s 是延迟加载的。
因此,您的视图可能如下所示:
profile = Profile.objects.get(user=request.user)
comments = profile.comments.select_related('author', 'author__user')
您将profile
和传递comments
给模板,然后使用以下命令检索它:
{% for comment in comments %}
<div>
<p>Author: {{ comment.author.user }}</p><img src="{{ comment.author.avatar.url }}">
<p>Message: {{ comment.body }}</p>
<p>Date posted: {{ comment.date_posted }}</p>
</div>
{% endfor %}
在这里,我们因此从查询集中读取评论,我们在同一查询中获取配置文件和该配置文件的用户。因此,我们将进行两个查询:一个查询,一个查询包括and在内的Profile
所有Comment
s 。.author
.author.user
推荐阅读
- image - FFMPEG:在视频上叠加图像并保留大小
- dialogflow-es - 输入无效后重新提示用户
- angular - 使用 Angular6 的响应式表单的日期时间选择器
- vba - 如何创建脚本来删除传入电子邮件的正文?
- node.js - 有没有办法将函数上下文发送到 nodejs mongoose 中的模型?
- c++ - 在与 for 循环时反转 PBM 图像的位
- rest - 在更新 Azure 流分析作业期间,我收到 HTTP 422 Unprocessable Entity
- node.js - 有没有可以快速加载和播放的node.js mp3模块
- php - 复杂的雄辩关系
- html - 我如何在角度材料选择表单组件中添加搜索功能?