2017-07-27 100 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字符串。