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

如何获取父序列化程序中的子级总数

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

    我想在父(票证计数器)序列化程序中显示与票证计数器关联的工人总数。

    下面是两个序列化程序:

    class TicketCounterSerializer(serializers.ModelSerializer):
     workers = WorkerToCounterSerializer(many=True, read_only=True)    
     class Meta:
         model = TicketCounter
         fields = (
                   'ticket_counter_name',
                   'ticket_counter_description',
                   'ticket_counter_address',
                   'workers',
                   )
    
    
    class WorkerToCounterSerializer(serializers.ModelSerializer):
     class Meta:
         model = WorkerToTicketCounter
         fields = (
             'user',
             'ticket_counter',
             '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')
    

    下面是我如何得到结果的:

    {
            "ticket_counter_name": "First",
            "ticket_counter_description": "firsty",
            "ticket_counter_address": "222fdssssss",
            "workers": [
                {
                    "user": 1,
                    "ticket_counter": 3,
                    "worker": 4,
    
                },
                {
                    "user": 1,
                    "ticket_counter": 3,
                    "worker": 5,
    
                },
    
            ]
     }
    

    这就是我想要的

    {
            "ticket_counter_name": "First",
            "ticket_counter_description": "firsty",
            "ticket_counter_address": "222fdssssss",
            "workers": 2 # just the total count
     }
    

    如何只显示总计数?

    1 回复  |  直到 6 年前
        1
  •  2
  •   willeM_ Van Onsem    6 年前

    你可以用一个 注释 ,并将其序列化为 IntegerField ,例如:

    class TicketCounterSerializer(serializers.ModelSerializer):
        num_workers = serializers.IntegerField()
        class Meta:
            model = TicketCounter
            fields = (
                'ticket_counter_name',
                'ticket_counter_description',
                'ticket_counter_address',
                'num_workers',
             )

    ViewSet ,我们可以指定:

    from django.db.models import Count
    
    class TicketCounterViewSet(viewsets.ListApiView):
        queryset = TicketCounter.objects.annotate(num_workers=Count('workers'))
        serializer_class = TicketCounterSerializer

    因此,我们对每一个 TicketCounter 具有属性的对象 num_workers 相关 WorkerToTicketCounter 对象。

    票务计数器 Ticket ,和 Worker