Django 根据条件对相关对象进行计数

标签 django django-models django-rest-framework

我想在计数之前过滤结果。在下面的代码中,我计算了每个售票柜台的工作人员总数。

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',
        )

最佳答案

,您可以在 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/

相关文章:

python - Django 多个媒体字段未上传到 S3

django - uWSGI "SIGNAL QUEUE IS FULL"错误

django - 在什么情况下 CSRF 豁免会产生危险?

python - Django 1.8 中的 seeds.rb - 引导数据库

python - 如何在 Django 管理中预填充 UserProfile 字段?

python - 如何在django中的单个 View 中显示多个ForeignKey过滤项?

django - DRF : how to integrate django-rest-framework-jwt to Djoser

python - 使用 JSONField() 获取 non_field_errors

python - Django:操纵 for 循环以不同方式呈现信息

Django AWS Elastic Beanstalk迁移数据库