2015-11-23 4 views
2

Я хотел бы десериализации этого JSON:Джанго рамка остальных объекты Deserialize на основе пользовательского класса

json1 = { 
    "age" : "22", 
    "name" : "Bob", 
    "lastname" : "Andrew", 
    "contactList" : [ 
    { "friend" : "Alice"}, 
    { "friend" : "John"} 
]} 

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

class Friend(object): 
    def __init__(self, friend): 
     self.friend = friend 

class Person(object): 
    def __init__(self, age , name , lastname, contactList): 
     self.age=age 
     self.name = name 
     self.lastname = lastname 
     self.contactList= [] #possible error here 

и следующие сериализаторов:

class FriendSeriliazer(serializers.Serializer): 
    friend = serializers.CharField() 

    def create(self, validated_data): 
     return Friend(**validated_data) 

class PersonSerializer(serializers.Serializer): 
    age = serializers.CharField() 
    name = serializers.CharField() 
    lastname = serializers.CharField() 
    contactList = FriendSerializer(many=True) 

    def create(self, validated_data): 
     print validated_data 
     simple = Person(**validated_data) 
     contactList = self.validated_data.pop('contactList') 
     for friend in contactList: 
      serializer = FriendSerializert(data=friend) 
      if serializer.is_valid(raise_exception=True): 
       person.contactList.append(serializer.save()) 
     return person 

плазменном T метод с точки зрения:

parsedData = PersonSerializer(data=request.data) 
    person = parsedData.save() 
    print person.contactList[0].friend #<-- nested object should be present 
    return Response(request.data, status=status.HTTP_200_OK) 

Я использовал DRF documentation для этого

Проблемы в том, что в то время как это работает мне нужна десериализация гораздо более сложная JSON и перебор внутренних объектов в создании функции ISN Не собираюсь это отрезать. Есть ли более автоматизированный способ?

+0

почему реализовать 'create' метод, если вы не хотите, чтобы спасти их? –

+0

Я начал без него, но потом получил исключение. «NotImplementedError: create() должно быть реализовано». –

ответ

0

В вашем случае вы не хотите сохранять базу данных, но в объекте и Django-Rest-Framework не поддерживает записываемые вложенные сериализаторы по умолчанию, тогда нет другого лучшего решения, кроме того, что вы делает. Вы должны реализовать этот процесс самостоятельно.

By default nested serializers are read-only. If you want to support write-operations to a nested serializer field you'll need to create create() and/or update() methods in order to explicitly specify how the child relationships should be saved.

Чтение Джанго-Rest-рамочная документация для получения дополнительной информации: Writable nested relationships

+0

Я действительно хочу сохранить данные из json в тип объекта класса Person, не сохраняя его в базе данных. Вот почему я только реализовал классы Person and Friend, а не их модели. на основе кода: объекта '= serializer.validated_data' возвращаемый объект типа Dict, и я хочу, возвращаемый объект к типу Person –

+0

Я обновил свой ответ. –

Смежные вопросы