这是我的模特:
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子句。
答案 0 :(得分:0)
您可以使用Count
和.annotate()
来实现这一目标:
>>> from django.db.models import Count
>>> skills = Skill.objects.annotate(form_count=Count("appform"))
您可以获取与每个技能实例关联的表单总数:
>>> skills[0].form_count
您可以使用.values()
将每个实例表示为仅包含id
和form_count
的字典:
>>> skills.values("id", "form_count")
<QuerySet [{'id': 1, 'form_count': 2}, {'id': 2, 'form_count': 3}, ...>