如何计算Django中带有注释的外键对象



大家好

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-通过订购

最新更新