我想在计数之前过滤结果。在下面的代码中,我计算了每个售票柜台的工作人员总数。
class TicketCounterList(ListAPIView):
queryset = TicketCounter.objects.filter(ticket_counter_is_deleted=False)
.annotate(num_workers=Count('workers'))
serializer_class = TicketCounterSerializer
上述代码中的 workers
是另一个模型(WorkerToTicketCounter
模型)中的 lated_name
。我想要做的是,我希望能够使用条件 is_deleted= True
过滤工作人员,而不是计算所有工作人员。是否可以?我正在使用 Django 1.11.13
有没有类似下面的内容
queryset = TicketCounter.objects.filter(ticket_counter_is_deleted=False)
.annotate(num_workers=Count('workers',filter="xxxx"))
明白了吗?我想过滤 worker
。
编辑: 我的模型:
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=<b>Cast(
Coalesce(Sum(Value(1) - F('workers__is_deleted')), Value(0))</b>,
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=<b>Cast(
Coalesce(Sum(F('workers__is_deleted')), Value(0))</b>,
IntegerField()
)
)
serializer_class = TicketCounterSerializer
关于Django 根据条件对相关对象进行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52118629/