2017-04-21 9 views
0

私はPostProfileモデルを持っています。私はユーザーの投稿のリストで最も一般的なcategoryを見つけようとしています。ここでクエリーセットで最も一般的なフィールド値を探す

は私のモデルです:

class Post(models.Model): 
    user = models.ForeignKey(User, blank=True, null=True) 
    category = models.CharField(max_length=20, choices=CATEGORY_CHOICES, default='1') 

class Profile(models.Model): 
    user = models.ForeignKey(User, blank=True, null=True) 

    def most_common_category(self): 
     posts = Post.objects.filter(user=self.user) 
     for post in posts: 
      print(post.category) # 1, 1, 2, 3, 2, 2, 4, 1, 2, 2 

私はこれをどのように行うのでしょうか?

+0

「注釈」を使用してこれを行う方法については、http://stackoverflow.com/a/629691/3901060を参照してください。あなたは指定をカテゴリに変更するだけです。 – FamousJameous

答えて

0
from django.db.models import Count 

most_common = Post.objects.annotate(mc=Count('category')).order_by('-mc')[0].mc 

あなたは生のクエリを使用してそれを行うことができますthe docs

+0

これを試してみましたが、最も一般的なカテゴリでは発注していません。編集:今、それは動作します、ありがとう。 – Zorgan

+0

カテゴリ1の代わりにカテゴリ2の投稿をもう一度試してみましたが、カテゴリ1が最も一般的です。これは、クエリーセットの最初のカテゴリのみを表示するようです。 – Zorgan

+0

あなたは最も一般的な順番で 'Post.objects.annotate(mc = Count( 'category'))のすべてのカテゴリをチェックすることができますorder_by( ' - mc')' –

0

でより多くの情報を見つけることができます。未加工のクエリテーブルでは、データベースのシーマに保存されたクラスメタまたはテーブル名を指定した名前でなければなりません。

most_common = Post.objects.raw(select 1 as id, category, count(category) from post group by category order by count(category) desc) 

または.valuesを使用できます。

most_common = Post.objects.values("category").annotate(count=Count('category')).order_by("-count") 
関連する問題