Как показать подкатегории под типом категории

Мне нужно получить дочерний список под родительским списком в виде группы.

class ServiceSerializer(serializers.ModelSerializer):
    cleaning_type = serializers.CharField(source='cleaning_type.cleaning_type_name')
    
    
    class Meta:
        model = Service
        fields = ('id', 'cleaning_type','service_name')


class ServiceTypeViewSet(ModelViewSet):
    serializer_class = ServiceSerializer
    http_method_names = ["get"]
    queryset = Service.objects.all()
    
    def get_queryset(self):
        """
        This view should return a list of all the service types.
        """
        servicename_list = Service.objects.all()
        return servicename_list

Показывает:

    [
        {
            "id": 1,
            "cleaning_type": "Lite service",
            "service_name": "Floors",
            
        },
        {
            "id": 2,
            "cleaning_type": "Lite service",
            "service_name": "Bathrooms",
            
        },
        {
            "id": 3,
            "cleaning_type": "Lite service",
            "service_name": "Kitchen",
            
        }
    ]

Я хочу, чтобы это было в следующем формате:

 [
  {
    id: 1,
    cleaning_type: 'Lite service',
    service_name: ['Floors', 'bathroom', 'kitchen'],
  },
  {
    id: 2,
    cleaning_type: 'Moving cleaning',
    service_name: ['Kitchen Including All Appliances And Cabinets'],
  },
]

Это означает, что все дочерние элементы будут находиться в отдельном родительском списке. Не разделены по отдельности.

models.py находится здесь:

Модель типа очистки:

class CleaningType(models.Model):
    cleaning_type_name = models.CharField(
        _("Select Cleaning Type"), blank=True, null=True, max_length=255)

    price = models.DecimalField(default=0,max_digits=6, decimal_places=2)    

    def __str__(self):
        return self.cleaning_type_name

Модель сервиса:

class Service(models.Model):

   cleaning_type = models.ForeignKey(
        CleaningType, on_delete=models.CASCADE)
   service_name = models.CharField(
       _("Service Name"), blank=True, null=True, max_length=255)

  

#string type added
def __str__(self):
    return str(self.service_name)
    

Мне нужны подкатегории в родительских категориях. Здесь cleaning_type - родительская категория, а service - дочерняя категория cleaning_type. т.е. : cleaning_type >> service_type

Я бы создал представление для родительской категории, а затем получил дочерние категории для каждой родительской категории. Сначала необходимо создать сериализатор для модели CleaningType:

class CleaningTypeSerializer(serializers.ModelSerializer):
    service_types = serializers.SerializerMethodField('get_service_types')

    def get_service_types(self, cleaning_type_name):
        return Service.objects.filter(cleaning_type=cleaning_type_name).values_list("service_name", flat=True)

    class Meta:
        model = CleaningType
        fields = "__all__"

Затем создайте представление, используя новый сериализатор:

class CleaningTypesViewSet(ModelViewSet):
    serializer_class = CleaningTypeSerializer
    http_method_names = ["get"]
    queryset = CleaningType.objects.all()

Ответ выглядит примерно так:

[
    {
        "id": 1,
        "service_types": [
            "Moving Service 1",
            "Moving Service 2",
            "Moving Service 3"
        ],
        "cleaning_type_name": "Moving Cleaning",
        "price": "200.00"
    },
    {
        "id": 2,
        "service_types": [
            "Another Service 1",
            "Another Service 2"
        ],
        "cleaning_type_name": "Another Cleaning",
        "price": "300.00"
    }
]
Вернуться на верх