Django 中的查询性能优化
Query Performance Optimization in Django
我在 Django 中创建博客网站,在为特定博客创建页面时 posts 我在使用 ORM 查询数据时遇到了问题。
我有一个 Post 模型,它与捕获所有评论的另一个模型评论相关。评论模型有以下字段 ->
class Comment(models.Model):
comment = models.TextField(null=True)
Created_date = models.DateTimeField(auto_now_add=True)
Updated_date = models.DateTimeField(auto_now=True)
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments_post')
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='comments_user')
def __str__(self):
return self.comment
现在在查询单个博客时 post 可能有 N 条评论,并且对于每条评论,都会分配一个写评论的用户。所以我想为每个评论的用户找到用户详细信息,例如(姓名、电子邮件或 phone 号码)。
我执行的查询是 ->
post = Post.objects.select_related().prefetch_related('images_set','comments_post').get(id=post_id)
现在,当我尝试使用 {{comment.user.email}}
时,如果 post 有 3 条评论,ORM 将向数据库查询 3 次以查找每个用户的电子邮件。但是如果我使用 {{comment.user_id}}
它只会查询一次,因为它会预加载 user_id 因为它在注释 table.
中可用
有什么方法可以只对数据库进行一次查询以获取所有评论的所有名称?
可能 prefetch_related
外键在外键中。例如prefetch_related('comments_post__user')
,或者如果你想要更高的性能你可以使用annotate
。注释必填字段,比prefetch
快
您可以将额外的查询保存到数据库中,该查询通过 Prefetch
object [Django-doc]:
获取用户
from django.db.models import Prefetch
post = Post.objects.select_related().prefetch_related(
'images_set',
<strong>Prefetch(</strong>'comments_post', Comment.objects<strong>.select_related('user'))</strong>
).get(id=post_id)
这将对数据库进行三次往返:一次用于 Post
,一次用于 image_set
,一次用于 comments_post
。最后一个还将获取用户的数据,以防止为此进行额外的查询。
我在 Django 中创建博客网站,在为特定博客创建页面时 posts 我在使用 ORM 查询数据时遇到了问题。
我有一个 Post 模型,它与捕获所有评论的另一个模型评论相关。评论模型有以下字段 ->
class Comment(models.Model):
comment = models.TextField(null=True)
Created_date = models.DateTimeField(auto_now_add=True)
Updated_date = models.DateTimeField(auto_now=True)
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments_post')
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='comments_user')
def __str__(self):
return self.comment
现在在查询单个博客时 post 可能有 N 条评论,并且对于每条评论,都会分配一个写评论的用户。所以我想为每个评论的用户找到用户详细信息,例如(姓名、电子邮件或 phone 号码)。
我执行的查询是 ->
post = Post.objects.select_related().prefetch_related('images_set','comments_post').get(id=post_id)
现在,当我尝试使用 {{comment.user.email}}
时,如果 post 有 3 条评论,ORM 将向数据库查询 3 次以查找每个用户的电子邮件。但是如果我使用 {{comment.user_id}}
它只会查询一次,因为它会预加载 user_id 因为它在注释 table.
有什么方法可以只对数据库进行一次查询以获取所有评论的所有名称?
可能 prefetch_related
外键在外键中。例如prefetch_related('comments_post__user')
,或者如果你想要更高的性能你可以使用annotate
。注释必填字段,比prefetch
您可以将额外的查询保存到数据库中,该查询通过 Prefetch
object [Django-doc]:
from django.db.models import Prefetch
post = Post.objects.select_related().prefetch_related(
'images_set',
<strong>Prefetch(</strong>'comments_post', Comment.objects<strong>.select_related('user'))</strong>
).get(id=post_id)
这将对数据库进行三次往返:一次用于 Post
,一次用于 image_set
,一次用于 comments_post
。最后一个还将获取用户的数据,以防止为此进行额外的查询。