Python Django是否在外部查询中维护内部查询的顺序?
我有一个概要文件模型,它引用了Django的默认用户模型。我想要一个增加点数的用户列表 我的个人资料模型:Python Django是否在外部查询中维护内部查询的顺序?,python,django,Python,Django,我有一个概要文件模型,它引用了Django的默认用户模型。我想要一个增加点数的用户列表 我的个人资料模型: class Profile(models.Model): username = models.ForeignKey(User, on_delete=None, primary_key=True) image = models.CharField(max_length=255, default="") points = models.IntegerField(defa
class Profile(models.Model):
username = models.ForeignKey(User, on_delete=None, primary_key=True)
image = models.CharField(max_length=255, default="")
points = models.IntegerField(default=0)
views = models.IntegerField(default=0)
def __str__(self):
return self.username.username
我提出这个问题:
users = User.objects.filter(username__in=Profile.objects.filter().order_by('-points').values('username__username'))
print(users,Profile.objects.filter().order_by('-points').values_list('username__username'))
我的输出是
<QuerySet [<User: aplha>, <User: baqir>, <User: beta>]> <QuerySet [{'username__username': 'beta'}, {'username__username': 'baqir'}, {'username__username': 'aplha'}]>
现在我们看到,配置文件模型按照我想要的顺序给出用户名,但是用户模型并没有保持这个顺序。如何使其保持与配置文件返回相同的顺序。在中使用
\u时,无法保证结果的顺序
您可以通过循环浏览配置文件来获取用户列表。如果使用select_related()
,则可以避免额外的查询来获取每个用户
profiles = Profile.objects.filter().order_by('-points').select_related('username')
users = [p.username for p in profiles]
请注意,最好将外键的用户名
外键重命名为用户
,因为外键后面返回的是用户
实例,而不是用户名
字符串。在中使用\u时,无法保证结果的顺序
您可以通过循环浏览配置文件来获取用户列表。如果使用select_related()
,则可以避免额外的查询来获取每个用户
profiles = Profile.objects.filter().order_by('-points').select_related('username')
users = [p.username for p in profiles]
请注意,最好将外键用户名
外键重命名为用户
,因为外键后面返回的是用户
实例,而不是用户名
字符串。这是怎么回事:
from django.db.models import Sum
users = User.objects.annotate(points=Sum('profile__points')).order_by('-points')
这是未经测试,但我希望它有帮助 这个怎么样:
from django.db.models import Sum
users = User.objects.annotate(points=Sum('profile__points')).order_by('-points')
这是未经测试,但我希望它有帮助 无法将关键字“profile\u set”解析到字段中。选项包括:回答、截止日期、加入日期、电子邮件、姓名、组、id、是否活动、是否工作人员、是否超级用户、最后登录、最后登录名、日志项、开启、密码、帖子、个人资料、问题、用户权限、用户名、视图、投票
您能给我一个简短的解释吗?我接受了你的回答。Thanks@BaqirKhan
中的\u不保证订单将被保留。因为,模型User
有自己的顺序。这就是为什么,您需要为用户
模型本身“注释”所需的字段,然后按该字段排序。在您的情况下,该注释是相关点
字段的总和。无法将关键字“profile\u set”解析为字段。选项包括:回答、截止日期、加入日期、电子邮件、姓名、组、id、是否活动、是否工作人员、是否超级用户、最后登录、最后登录名、日志项、开启、密码、帖子、个人资料、问题、用户权限、用户名、视图、投票
您能给我一个简短的解释吗?我接受了你的回答。Thanks@BaqirKhan
中的\u不保证订单将被保留。因为,模型User
有自己的顺序。这就是为什么,您需要为用户
模型本身“注释”所需的字段,然后按该字段排序。在您的例子中,该注释是相关点
字段的总和。