2017-07-27 1 views
0

私はDjangoのデフォルトのUserモデルを参照するプロファイルモデルを持っています。私はポイントが増加しているユーザーのリストが必要です。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'}]> 

今ここで私たちはProfileモデルは、ユーザ名を与えている、見ています私が望むのと同じ順序で、しかしユーザーモデルはその順序を維持していません。プロフィールの返品と同じ注文を維持する方法

答えて

1

方法:

from django.db.models import Sum 

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

これはテストされていませんが、私はそれが役に立てば幸い!

+0

'キーワード 'profile_set'をフィールドに解決できません。選択肢は次のとおりです:回答、日付、姓、電子メール、名前、グループ、ID、is_active、is_staff、last_login、last_name、ログオン、パスワード、投稿、プロフィール、質問、ユーザー権限、ユーザー名、表示、投票 ' –

+0

@BaqirKhan 'profile__points'で試してください。更新された私の答え –

+0

私に簡単な説明を教えてもらえますか?私はあなたの答えを受け入れた。ありがとう –

1

_inを使用すると、結果の順序が保証されません。

プロファイルをループしてユーザーリストを取得できます。 select_related()を使用すると、各ユーザーを取得するために追加のクエリを避けることができます。外部キーがUserインスタンス、ないusername文字列を返し、次のことから、userに外国username外部キーの名前を変更した方がよいかもしれないことを

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

は注意してください。これについて

関連する問題