2017-09-24 21 views
0

私は、次の2つの機種があります。Djangoのモデルのクエリ

class User(models.Model): 
    user_id = models.IntegerField(null=True) 
    name = models.CharField(max_length=50) 

class Blog(models.Model): 
    id = models.IntegerField(primary_key=True) 
    user = models.ForeignKey(User, null=True) 
    timestamp = models.DateTimeField() 

がどのように私は、次の形成を持っているオブジェクトのリストを取得するにはDjangoのモデルクエリを書くことができます -

[(user_object, number of blog posts of this user), ...] 

にこのリストをされます降順であるはずです。基本的には、ユーザーが書き込んだブログ記事の数についての情報を取得したいと考えています。

2人のユーザーが同数のブログ投稿を持っているため、作成したブログポストの最新のタイムスタンプに基づいて並べ替える必要があります。

これまでのところ、私は以下のことを試してみて、私のアプローチでは失敗しました。

user = User.objects.all() 
    serializer = UserSerializer(user, many=True) 
    user = list(serializer.data) 
    user_ranks = [(key, len(list(group))) for key, group in groupby(user)] 
    user_ranks = sorted(user_ranks, key=lambda x: x[1], reverse=True) 

timestampのコードを上記のコードと比較してプラグインする方法がわかりません。また、これを達成するより良い方法がありますか?

PS:Userのエントリ数は、エントリの数と同じであるBlog

答えて

1

であなたが

user = models.ForeignKey(User, null=True, related_name='bloguser') 

を設定した場合は、ブログの数を添付する

from django.db.models import Count 
some_query = User.objects.filter(...).annotate(foobar = count('bloguser')) 

を使用することができますsome_query.foobarを使用してテンプレート内でアクセスできます。

タイムスタンプのための

some_query = User.objects.filter(...).annotate(foobar = count('bloguser')).annotate(foomax = Max('bloguser__timestamp')) 
+0

'timestamp'部分をどのように扱いますか? –

+0

https://stackoverflow.com/questions/844591/how-to-do-select-max-in-django – DisneylandSC

+0

また、ユーザーモデルに最新のブログ投稿を記録することもできます。次に、単純に.orderby() – DisneylandSC