Django从注释计数中排除 [英] Django exclude from annotation count
问题描述
我有以下应用程序:
从django.db导入模型
pre>
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)
工人= Worker.objects.all()。annotate(num_jobs = Count('job'))
worker s [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。 strong>我想让所有的工作人员都在queryset,即使是那些没有工作的人。
解决方案update :好的,我用这个玩了一些产生解决方案,我想我用条件表达式:
条件表达式允许您使用if ... elif ... else逻辑
过滤器,注释,聚合和更新。条件
表达式计算表
的每一行的一系列条件,并返回匹配的结果表达式。
<注意: 条件表达式 (例如<由@Pynchia指出,code>案例和当
)在Django 1.8 中是
从django.db.models导入IntegerField,Sum,Case,当
workers = Worker.objects。注释(
num_jobs = Sum(
Case(
When(job__is_completed = True,then = 1))
default = 0,
output_field = IntegerField()
)
)
)
现在,每个工作人员都会有一个num_jobs这将是一个整数,显示工作人员有多少完成的工作:)
I have following application:
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()
I want to annotate Workers query with count of completed jobs.
I'll try to do it with following script:
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')) # >>> []
Result of the last query is empty. How to exclude elements from reverse relation?
Django 1.8, python 2.7
UPD. I would like to have all workers in queryset, even those, who has a zero jobs
解决方案update: ok I played a bit with this to generate the solution and I think I got it using Conditional Expressions:
Conditional expressions let you use if ... elif ... else logic within filters, annotations, aggregations, and updates. A conditional expression evaluates a series of conditions for each row of a table and returns the matching result expression.
Note: Conditional Expressions (such as
Case
andWhen
) are new in Django 1.8, as pointed out by @Pynchiafrom 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() ) ) )
now, each worker will have a num_jobs which will be an Integer that shows how many completed jobs that worker has :)
这篇关于Django从注释计数中排除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!