JsonField в DRF

У меня есть модель, как показано ниже, которая включает JsonField:

class Animal(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_field=15)
    data = models.JSONField()

структура поля data выглядит следующим образом:

[
   {
    "age":"15",
    "color":white,
    ...
   },
   {
    ...
    ...
   }
]

И моя цель - показать эту модель в DRF как показано ниже:

[
   {
       "id": 1,
       "name": "Bell",
       "data": [
                  {
                      "age":"15",
                      "color":"white",
                      ...
                  },
                  {
                       ...,
                       ...
                   }
               ]
   }
]

Но когда я использую JsonFeild в своей модели, мои данные генерируются liKe:

[
   {
       "id": 1,
       "name": "Bell",
       "data": "[{\"age\":\"15\",\"color\":\"white\",...},{\...,|... }]"
   }
]

Преобразуется в строку и имеет \ в символах.

Мой сериализатор:

class AnimalSerializer(serializers.ModelSerializer):
class Meta:
    model = Animal
    fields = "__all__"

Чтобы явно указать DRF, как обрабатывать поле data, вы можете назначить ему сериализатор ListField (поскольку, как я вижу, его первый уровень - это список) следующим образом:

from rest_framework import serializers

class AnimalSerializer(serializers.ModelSerializer):
    data = serializer.ListField()
    class Meta:
        model = Animal
        fields = "__all__"

В качестве опции вы можете передать аргумент child в ListField, который также является сериализатором, но для элементов списка, чтобы они тоже были проверены.

Или вы можете использовать JSONField, если это вам подходит.

Документация: https://www.django-rest-framework.org/api-guide/fields/#listfield https://www.django-rest-framework.org/api-guide/fields/#jsonfield

Я нашел свою проблему:

Я преобразовал свои данные в json с помощью json.dumps() и присвоил данные json полю JsonField, причина "[{\"..\"}]" в том, что мне просто нужно присвоить мой словарь полю JsonField.

Вернуться на верх