gpt4 book ai didi

python - Django 从注释计数中排除

转载 作者:行者123 更新时间:2023-12-04 13:31:38 25 4
gpt4 key购买 nike

我有以下应用程序:

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

更新。 我想让所有工作人员都在查询集中,即使是那些工作为零的工作人员

最佳答案

更新 :好的,我用这个来生成解决方案,我想我是用 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.



注: Conditional Expressions (例如 CaseWhen )是 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()
)
)
)

现在,每个 worker 都有一个 num_jobs ,它将是一个整数,显示该 worker 有多少已完成的工作:)

关于python - Django 从注释计数中排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31852672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com