大家好
Django中的新手,并且感到困惑,感谢您的帮助
有三种型号:
class Organization(models.Model):
organization_name = models.CharField(max_length=50)
class AppealForm(models.Model):
form_name = models.CharField(max_length=50)
class Appeal(models.Model):
organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
appeal_form = models.ForeignKey(AppealForm, on_delete=models.CASCADE)
applicant_name = models.CharField(max_length=150)
组织模型的对象:
organization_name |
---|
组织1 |
组织2 |
我建议您阅读本文档部分中关于如何在django中进行复杂查询的内容。以下是您的查询:
from django.db.models import Count, Case, When, IntegerField
Appeal.objects
.values('organization')
.annotate(
total_appeals=Count('appeal_form'),
written_amount=Count(Case(
When(appeal_form__form_name="In written form", then=1),
output_field=IntegerField(),
)),
oral_amount=Count(Case(
When(appeal_form__form_name="In oral form", then=1),
output_field=IntegerField(),
)),
).order_by()
将上面的查询设置为一个值,然后循环查看结果。你应该得到这样的
[{‘organization’:‘organization 1’,‘total_appeals’:3,"written_amount":1,"oral_amount":2},{"organization":"组织2","total_appeals":2,"written_amount":1,'oral_amount':1}]
解释:
- 按
organization
分组的值 Count
对该组织组中的表单进行计数- 我们使用
Case
添加一个if condition
,然后=1返回值(否则返回null( - written_amount需要是整数,所以我们在
output_field
中设置它
文档中的条件部分https://docs.djangoproject.com/en/dev/ref/models/conditional-expressions
为什么应该使用orderby((对查询进行分组https://docs.djangoproject.com/en/4.0/topics/db/aggregation/#interaction-通过订购