我正在制作一个博客网站,我在查询性能方面遇到了一些问题.

我有三个模型

  1. 用户模型->用户(存储用户邮箱、密码等)
  2. 后模型-> Actual Posts
  3. 人物模型->(用于存储用户的额外信息)

后模型->

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    category = models.ForeignKey(Category, on_delete=models.PROTECT)
    title = models.CharField(max_length=255,null=True)   
    description = models.CharField(max_length=1000,null=True)
    Likes = models.ManyToManyField(to=User, related_name='Post_likes')
    favourites = models.ManyToManyField(to=User,blank=True,related_name="favourite")

人物模型->

class People(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    photo = models.ImageField(upload_to='profile_pics', blank=True,null=True)
    Phone_number = models.CharField(max_length=255,null=True,blank=True)
    Birth_Date = models.DateField(null=True,blank=True)
    Created_date = models.DateTimeField(auto_now_add=True)
    Updated_date = models.DateTimeField(auto_now=True)

现在,由于这两个模型都连接到用户模型.我想查询帖子模型,并在模板中获取用户照片.现在,当我使用post.user.people.photo时,它会为每一篇帖子生成一个单独的对DB的查询,导致速度变慢.我想在这里使用Join组合多个表,并一次获取所有记录.

我目前正在使用以下查询->

posts =  Post.objects.select_related().prefetch_related('images_set').annotate(comments_Count = Count('comments_post',distinct=True)).annotate(Count('Likes',distinct=True)).all().order_by('-id')

推荐答案

您可以在user上执行.select_related(…) [Django-doc],在people上执行user__people,因此:

posts = Post.objects.select_related(
    'user__people', 'category'
).prefetch_related('images_set').annotate(
    comments_Count = Count('comments_post',distinct=True),
    Count('Likes',distinct=True)
).order_by('-id')

Note:通常使用settings.AUTH_USER_MODEL [Django-doc]来表示用户模型比直接使用User model [Django-doc]更好.有关更多信息,请参阅referencing the User model section of the documentation.

Django相关问答推荐

如何创建为模型创建信号的Djangodecorator ?

从Azure Web应用服务器上的cron任务的虚拟环境加载变量

APIView查询未返回任何结果

Urls.py中路径**kwargs的Django翻译?

如何显示;Django认证系统;在模板中?

更改Django的创建时间字段

SQLite上可以正常使用Many2Many链接注释,但MariaDB上无法正常使用(生产环境)

Django中用于外键的嵌套循环

使用 Crispy Forms 时 Django 返回 'TemplateDoesNotExist'

Django ORM:子查询上的文本聚合器

如何在 Django 模型中存储元组列表

Django 从 url 保存图像并与 ImageField 连接

在 Django 过滤器语句中,__exact 和等号 (=) 有什么区别?

在 django web 应用程序中,如何给用户自己的子域?

使用 XMLHttpRequest 提示下载文件

Django 删除未使用的媒体文件

django 模板中对象的模型名称

在 docker 容器中创建 django 超级用户而不输入密码

Django:何时使用 QuerySet 无

获取 django 应用的绝对路径