2017-07-27 106 views
0

我有一个配置文件模型,它引用了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(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'}]> 

现在,在这里我们看到,剖面模型是给用户名以我想要的顺序排列,但用户模型不保持该顺序。如何使其保持与配置文件返回相同的顺序。

回答

1

如何:

from django.db.models import Sum 

users = User.objects.annotate(points=Sum('profile__points')).order_by('-points') 

这是未经测试,但我希望它能帮助!

+0

'无法将关键字'profile_set'解析到字段中。选择是:答案,通过,date_joined,电子邮件,名字,组,身份证,is_active,is_staff,is_superuser,last_login,last_name,logentry,在,密码,发布,配置文件,问题,用户权限,用户名,查看,投票' –

+0

@BaqirKhan尝试'profile__points'。更新了我的回答 –

+0

你能给我一个简短的解释吗?我接受了你的答案。谢谢 –

1

当您使用_in时,不保证结果的顺序。

您可以通过循环遍历配置文件来获取用户列表。如果您使用select_related(),那么您将避免额外的查询来获取每个用户。

profiles = Profile.objects.filter().order_by('-points').select_related('username') 
users = [p.username for p in profiles] 

注意,这可能是更好的外国username外键重命名为user,因为下面的外键回报User实例,而不是username字符串。