我有以下申请:
from django.db import models
class Worker(models.Model):
name = models.CharField(max_length=60)
def __str__(self):
return self.name
class Job(models.Model):
worker = models.ForeignKey(Worker)
is_completed = models.BooleanField()
我想用已完成作业的计数来注释 Workers 查询。
我将尝试使用以下脚本来完成此操作:
from myapp.models import Worker, Job
from django.db.models import Count
w = Worker.objects.create(name='Worker1')
Job.objects.create(worker=w, is_completed=False)
Job.objects.create(worker=w, is_completed=False)
Job.objects.create(worker=w, is_completed=True)
Job.objects.create(worker=w, is_completed=True)
workers = Worker.objects.all().annotate(num_jobs=Count('job'))
workers[0].num_jobs
# >>> 4
workers = Worker.objects.all().exclude(job__is_completed=False).annotate(num_jobs=Count('job'))
# >>> []
最后一次查询的结果为空。如何从反向关系中排除元素?
Django 1.8、Python 2.7
UPD.我希望查询集中有所有工作人员,即使是那些工作为零的工作人员
update:好的,我用这个来生成解决方案,我想我用它得到了它条件表达式 https://docs.djangoproject.com/en/1.8/ref/models/conditional-expressions/:
条件表达式让您可以使用 if ... elif ... else 逻辑
过滤器、注释、聚合和更新。有条件的
表达式计算表中每一行的一系列条件
并返回匹配结果表达式。
Note: 条件表达式 https://docs.djangoproject.com/en/dev/ref/models/conditional-expressions/(例如Case
and When
) are Django 1.8 中的新功能,正如@Pynchia 所指出的
from django.db.models import IntegerField, Sum, Case, When
workers = Worker.objects.annotate(
num_jobs=Sum(
Case(
When(job__is_completed=True, then=1),
default=0,
output_field=IntegerField()
)
)
)
现在,每个工人都会有一个 num_jobs ,它是一个整数,显示工人有多少已完成的工作:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)