Плоский JSON для вложенного JSON с использованием Django RestFramework - PullRequest
0 голосов
/ 10 июня 2018

У меня есть json на мой взгляд, как показано ниже,

{
"name":"myname",
"age":30,
"day":20,
"month":"June",
"year":1988
}


Как я могу преобразовать его во вложенный JSON, как показано ниже, с использованием сериализаторов?,

{
"name":"myname",
"age":30,
"DOB":{
    "day":20,
    "month":"June",
    "year":1988
    }
}

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

@ No-One , Предположим, вы определили свои модели следующим образом.

http://www.django -rest-framework.org / api-guide /Связи /

Использование ForeignKey () для вложенного словаря, например {'day': 20, 'month': 'June', 'year': 1998}.

class Dob(models.Model):
    day = models.IntegerField()
    month = models.CharField(max_length=10)
    year = models.IntegerField()

    def __str__(self):
        return str(self.day)

class User(models.Model):
    name = models.CharField(max_length=50, null=False, blank=False)
    age = models.IntegerField()
    dob = models.ForeignKey(Dob, on_delete=models.CASCADE, null=False)

    def __str__(self):
        return self.name

enter image description here

enter image description here

Тогда я предлагаю вам определить ваши сериализаторы следующим образом.

Пожалуйста, прокомментируйте, если вызапросы.

class DobSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Dob 
        fields = ('day', 'month', 'year')

class UserSerializer(serializers.HyperlinkedModelSerializer):
    dob = DobSerializer(many=False, read_only=True);

    class Meta:
        model = User
        fields = ('name', 'age', 'dob');

enter image description here

0 голосов
/ 10 июня 2018

Если я не ошибаюсь, вам нужно определить два класса сериализатора, как показано ниже:

from rest_framework import serializers

class MyNestedSerializer(serializers.Serializer):
    day = serializers.IntegerField()
    month = serializers.CharField()
    year = serializers.IntegerField()

class MyBasicSerializer(serializers.Serializer):
    name = serializers.CharField()
    age = serializers.IntegerField()
    DOB = MyNestedSerializer(source='*')

, тогда вы получите вложенные данные как:

nested_json = MyBasicSerializer(my_flat_input).data

Значение source='*' имеет особое значение и используется для указания того, что весь объект должен быть передан в поле.Это может быть полезно для создания вложенных представлений или для полей, которым требуется доступ ко всему объекту для определения выходного представления.

Ссылка:

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