Как получить Total Children в родительском сериализаторе - PullRequest
0 голосов
/ 31 августа 2018

Я хочу отобразить общее количество рабочих, связанных с счетчиком билетов, в родительском (счетчике) сериализаторе.

Ниже приведены два сериализатора:

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 Ответ

0 голосов
/ 31 августа 2018

Вы можете сделать это с аннотацией и сериализовать ее как IntegerField, например:

class TicketCounterSerializer(serializers.ModelSerializer):
    num_workers = <b>serializers.IntegerField()</b>
    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):
    <b>queryset = TicketCounter.objects.annotate(num_workers=Count('workers'))</b>
    serializer_class = TicketCounterSerializer

Таким образом, мы аннотируем каждый TicketCounter объект с атрибутом num_workers, который содержит номер связанного WorkerToTicketCounter объекта.

Лично я думаю, что у моделирования есть несколько странных имен: TicketCounter на самом деле не выглядит как счетчик. Хотя я не знаю всей области применения вашего приложения, я думаю, что модели с именами Ticket и Worker, возможно, имеют больше смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...