django - Django根据条件计算相关对象
问题描述
我想在计数之前过滤结果。在下面的代码中,我正在计算每个售票柜台的工人总数。
class TicketCounterList(ListAPIView):
queryset = TicketCounter.objects.filter(ticket_counter_is_deleted=False)
.annotate(num_workers=Count('workers'))
serializer_class = TicketCounterSerializer
workers
在上面的代码中是related_name
来自另一个模型(WorkerToTicketCounter
模型)。我想要做的是,我希望能够过滤有条件的工人,is_deleted= True
而不是计算所有工人。是否可以?我正在使用 Django 1.11.13
有没有像下面这样的
queryset = TicketCounter.objects.filter(ticket_counter_is_deleted=False)
.annotate(num_workers=Count('workers',filter="xxxx"))
得到它?我想过滤workers
.
编辑:我的模型:
class TicketCounter(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
ticket_counter_name = models.CharField(max_length=100, default="")
ticket_counter_description = models.CharField(max_length=1500, default="")
ticket_counter_address = models.CharField(max_length=1500, default="")
class WorkerToTicketCounter(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
ticket_counter = models.ForeignKey(TicketCounter,related_name="workers")
worker = models.ForeignKey(User,related_name='worker_for_ticket_counter')
我的序列化器:
class TicketCounterSerializer(serializers.ModelSerializer):
num_workers = serializers.IntegerField()
class Meta:
model = TicketCounter
fields = (
'ticket_counter_name',
'ticket_counter_description',
'ticket_counter_address',
'num_workers',
)
解决方案
从django-2.0 开始,您可以在 中进行过滤Count
,但这对我们没有帮助。
然而,我们可以做的是总结,workers__is_deleted
或它的否定。例如,如果我们要返回未删除的工人数量:
from django.db.models import F, IntegerField, Sum, Value
from django.db.models.functions import Coalesce
class TicketCounterList(ListAPIView):
queryset = TicketCounter.objects.filter(
ticket_counter_is_deleted=False
).annotate(
num_workers=Cast(
Coalesce(Sum(Value(1) - F('workers__is_deleted')), Value(0)),
IntegerField()
)
)
serializer_class = TicketCounterSerializer
或者,如果您想计算已删除的工作人员:
from django.db.models import F, IntegerField, Sum, Value
from django.db.models.functions import Coalesce
class TicketCounterList(ListAPIView):
queryset = TicketCounter.objects.filter(
ticket_counter_is_deleted=False
).annotate(
num_workers=Cast(
Coalesce(Sum(F('workers__is_deleted')), Value(0)),
IntegerField()
)
)
serializer_class = TicketCounterSerializer
推荐阅读
- python - 在每个月的特定日期查找和比较股票价格
- python-3.x - 本地工作的硒浏览器下载文件自动化代码在gcp linux服务器中不起作用
- python - ffmpeg如何将pcm编解码器标签添加到输出
- tensorflow - ML.NET 是否与 TF2 saved_model 格式兼容?
- postgresql - 将动态查询保存到 postgres 存储过程中的变量
- javascript - How to listen to the input event of the Stripe cardElement to determine if card is invalid and disable the button?
- html - 在 flexbox 中将图像居中
- python - 在python上保存变量的输入
- delphi - Retry after exception in delphi
- api - 如何制作侮辱命令(discord.py)