2017-05-25 4 views
1
ここ

でクエリによってグループを作ることは私のモデルである:ジャンゴ

from django.db import models 

# Create your models here. 
class Skill(models.Model): 
    name = models.CharField(max_length=100) 

    def __str__(self): 
     return '%s' % self.name 

class AppForm(models.Model): 
    creation_date = models.DateField(db_index=True) 
    first_name = models.CharField(max_length=100) 
    last_name = models.CharField(max_length=100) 
    phone_number = models.CharField(max_length=100) 
    ... 
    preferred_skill = models.ManyToManyField(Skill,db_index=True) 
    preferred_skill_other = models.CharField(max_length=250,default='') 
    ... 

私は次のクエリしたいと思います:

sqlite> SELECT "app_form_appform_preferred_skill"."skill_id", 
     COUNT("app_form_appform"."id") 
     FROM "app_form_appform" 
     INNER JOIN "app_form_appform_preferred_skill" 
     ON ("app_form_appform"."id" = "app_form_appform_preferred_skill"."appform_id") 
     GROUP BY "app_form_appform_preferred_skill"."skill_id"; 

注:app_form_appform_preferred_skillはジャンゴで作成したテーブルであるによるとモデルで指定された多対多の関係。

このクエリはdjango ORMを使用して作成できますか?私は集約を使用しようとしましたが、私はそれがこのクエリが行うことを得ることができませんでした、私の難しさは、ORMを使用してGROUP BY句を取得することです。

答えて

0

あなたは.annotate()とともにCountを使用していることを達成することができます:あなたがそれぞれを表すために.values()を使用することができます

>>> skills[0].form_count 

>>> from django.db.models import Count 
>>> skills = Skill.objects.annotate(form_count=Count("appform")) 

をあなたは各スキルのインスタンスに結ばフォームの合計数を取得することができます例:idform_countのみを含む辞書として:

>>> skills.values("id", "form_count") 
<QuerySet [{'id': 1, 'form_count': 2}, {'id': 2, 'form_count': 3}, ...>