在Django中通过查询创建一个组

时间:2017-05-25 09:26:12

标签: django django-models

这是我的模特:

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创建的表,因为模型中指定了多对多关系。

这个查询可以仅使用django ORM吗?我试图使用聚合,但我不能让它做这个查询的工作,我的困难在于使用ORM获取GROUP BY子句。

1 个答案:

答案 0 :(得分:0)

您可以使用Count.annotate()来实现这一目标:

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

您可以获取与每个技能实例关联的表单总数:

>>> skills[0].form_count

您可以使用.values()将每个实例表示为仅包含idform_count的字典:

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