微调Django查询集检索

时间:2017-03-29 20:11:17

标签: django django-queryset

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

usernameavatarscore

从用户模型中检索usernameavatar模型中存在scoreUserProfile(具有一对一的字段指向User模型,名为user)。

目前我的方法是获取完整的对象(见下文),即使我只需要两个模型中的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进行迭代,并在每个用户的usernamescoreavatar中显示Django模板。那么检索和汇总这些信息的最有效,最轻量级的方法是什么呢?

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

1 个答案:

答案 0 :(得分:1)

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

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

此解决方案将返回字典,但您可以尝试使用only而不是值,它会使用指定的字段创建django模型对象,但如果您尝试访问未指定的字段,则#39} ; ll生成其他查询。

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