【问题标题】:Fine tuning Django queryset retrieval微调 Django 查询集检索
【发布时间】:2017-08-23 12:21:11
【问题描述】:

在我的 Django 应用程序中,我需要为用户列表(称为 user_ids)显示他们的:

usernameavatarscore

username 是从 User 模型中检索到的,而 avatarscore 存在于 UserProfile 模型中(它具有指向 User 模型的一对一字段,称为 @ 987654330@)。

目前我的方法是获取完整的对象(见下文),即使我只需要来自两个模型的 3 个属性。

对我来说,只检索必填字段而不是其他的最有效方法是什么?现在我知道我可以做到:

usernames = User.objects.filter(id__in=user_ids).values_list('username',flat=True)
scores_and_avatars = UserProfile.objects.filter(user_id__in=user_ids).values_list('score','avatar')

但是,这些给了我单独的查询集,所以我不能将它们作为一个统一的 object_list 进行迭代,并在 Django 模板中显示每个用户的 usernamescoreavatar。那么,检索这些信息并将其组合在一起的最有效、最轻量级的方法是什么?


目前,我正在执行以下操作来检索这三个字段:queryset = User.objects.select_related('userprofile').filter(id__in=user_ids)

【问题讨论】:

  • 我认为这是使用 select_related 最有效的方法

标签: django django-queryset


【解决方案1】:

使用values 的最有效方式,您的查询将如下所示:

usernames = User.objects.filter(id__in=user_ids).values('username', 'userprofile__score', 'userprofile__avatar')

此解决方案将返回字典,但您可以尝试使用 only 而不是值,它会创建具有指定字段的 django 模型对象,但如果您尝试访问未指定的字段,它将生成额外的查询。

usernames = User.objects.filter(id__in=user_ids).select_related('userprofile').only('username', 'userprofile__score', 'userprofile__avatar')

【讨论】:

  • 谢谢,这是有道理的。可以肯定的是,这里不需要prefetch_related
  • 值自动创建连接,无需选择相关
  • 应该在第二个建议中包含.filter(id__in=user_ids)(现在它正在查询模型中的所有对象
  • 是的,很抱歉错过了
  • 但请注意,如果您尝试访问其他字段,则会产生额外的查询,因此请谨慎使用。
猜你喜欢
  • 2012-01-04
  • 2019-04-12
  • 2012-10-04
  • 2012-11-26
  • 2021-10-29
  • 1970-01-01
  • 2013-06-30
  • 2012-04-14
  • 2010-11-26
相关资源
最近更新 更多