代码之家  ›  专栏  ›  技术社区  ›  Naroju

Django计数具有条件的相关对象

  •  1
  • Naroju  · 技术社区  · 6 年前

    我想在计数前过滤结果。在下面的代码中,我正在计算每个售票处的员工总数。

    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

    下面有类似的吗

    queryset = TicketCounter.objects.filter(ticket_counter_is_deleted=False)
                .annotate(num_workers=Count('workers',filter="xxxx"))
    

    了解了?我想过滤 工人 .

    编辑:

    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',
            )
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   willeM_ Van Onsem    6 年前

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