Django остальная часть ответов по категориям - PullRequest
1 голос
/ 14 февраля 2020

Я использую Django сериализатор структуры остатка для возврата планов для мобильного приложения. На данный момент мой ответ сериализатора выглядит следующим образом:

[
    {
        "id": 1,
        "nome": "Test",
        "localizacao": "Example - MG",
        "instituicao": "Example",
        "modalidade": "Example",
        "categoria": "Category 1",
        "frequencia_semanal": 1,
        "carga_horaria": 2,
        "quantidade_alunos": 2,
        "valor_unitario": "12.00",
        "taxa_matricula": "12.00",
        "informacoes_adicionais": ""
    }
]

Мне нужно разделить планы по категориям, поэтому структура ответа должна выглядеть следующим образом:

[
    "Category 1": [
        {
            "id": 1,
            "nome": "Test",
            "localizacao": "Example",
            "instituicao": "Example",
            "modalidade": "Example",
            "frequencia_semanal": 1,
            "carga_horaria": 2,
            "quantidade_alunos": 2,
            "valor_unitario": "12.00",
            "taxa_matricula": "12.00",
            "informacoes_adicionais": ""
        }
    ]
]

Значение "категорий" должно быть ключами, и все ключи, относящиеся к этой категории, должны содержаться в ключе.

есть мой models.py

class Plano(models.Model):
    PUBLICO_ALVO_MENORES = 1
    PUBLICO_ALVO_ADOLESCENTES = 2
    PUBLICO_ALVO_ADULTOS = 3
    PUBLICO_ALVO_TODOS = 4
    PUBLICO_ALVO_CHOICES = (
        (PUBLICO_ALVO_MENORES, 'Menores'),
        (PUBLICO_ALVO_ADOLESCENTES, 'Adolecentes'),
        (PUBLICO_ALVO_ADULTOS, 'Adultos'),
        (PUBLICO_ALVO_TODOS, 'Todas as idades'),
    )
    nome = models.CharField(max_length=200)
    localizacao = models.ForeignKey('Localizacao', on_delete=models.PROTECT)
    instituicao = models.ForeignKey('Instituicao', null=True, on_delete=models.PROTECT)
    modalidade = models.ForeignKey('PlanoModalidade', verbose_name='Modalidades', on_delete=models.PROTECT)
    categoria = models.ForeignKey('PlanoCategoria', verbose_name='Categorias', on_delete=models.PROTECT)
    publico_alvo = models.SmallIntegerField(choices=PUBLICO_ALVO_CHOICES, null=True)
    frequencia_semanal = models.PositiveSmallIntegerField(verbose_name='Frequência semanal')
    carga_horaria = models.PositiveSmallIntegerField(verbose_name='Carga horária diária')
    quantidade_alunos = models.PositiveSmallIntegerField(verbose_name='Quantidade de alunos')
    valor_unitario = models.DecimalField(decimal_places=2, max_digits=18, verbose_name='Valor unitário')
    taxa_matricula = models.DecimalField(decimal_places=2, max_digits=18, verbose_name='Taxa matrícula')
    informacoes_adicionais = models.TextField(max_length=200, blank=True)

DRF serializers.py

class PlanosSerializer(serializers.ModelSerializer):
    categoria = serializers.StringRelatedField()
    modalidade = serializers.StringRelatedField()
    localizacao = serializers.StringRelatedField()
    instituicao = serializers.StringRelatedField()

    class Meta:
        model = Plano
        fields = [
            'id', 'nome', 'localizacao', 'instituicao', 'modalidade', 'categoria',
            'frequencia_semanal', 'carga_horaria', 'quantidade_alunos', 'valor_unitario',
            'taxa_matricula', 'informacoes_adicionais',
        ]

Пожалуйста, помогите мне, ха-ха.

1 Ответ

1 голос
/ 14 февраля 2020

Я рекомендую изменить ваш JSON на что-то похожее на:

[{ 
     "category_id":1,
     "category_name":"Category 1",
     "category_items":[ 
        { 
           "id":1,
           "nome":"Test",
           "localizacao":"Example",
           "instituicao":"Example",
           "modalidade":"Example",
           "frequencia_semanal":1,
           "carga_horaria":2,
           "quantidade_alunos":2,
           "valor_unitario":"12.00",
           "taxa_matricula":"12.00",
           "informacoes_adicionais":""
        }
     ]
  }]

А еще проще, создать с помощью neested serializer. https://www.django-rest-framework.org/api-guide/relations/#nested -relationships

...