Django从注释计数中排除 [英] Django exclude from annotation count

查看:137
本文介绍了Django从注释计数中排除的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下应用程序:

 从django.db导入模型


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()
pre>

我想用已完成作业的计数注释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 and When) are new in Django 1.8, as pointed out by @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()
                  )
               )
           )

now, each worker will have a num_jobs which will be an Integer that shows how many completed jobs that worker has :)

这篇关于Django从注释计数中排除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆