2014-11-27 5 views
0

Предположим, у меня есть эта сериалайзер в Django REST:Какой метод я могу использовать перед десериализацией в Django REST?

class MySerializer(serializers.ModelSerializer): 
    age = serializers.SerializerMethodField('get_age') 

    class Meta: 
     model = MyModel 
     fields = ('field1', 'field2', 'age') 

    def get_age(self, obj): 
     return obj.age * 100 

Теперь, когда работает отлично для сериализации.

Но теперь я хочу, чтобы, когда я десериализую, это будет divide the age by 100.

Как я могу это сделать?

+0

Эта работа: http://stackoverflow.com/questions/19373766/django-rest-framework-custom-serialize-a-field? –

+0

@SimeonVisser Это то, что у меня уже есть. Это работает для запросов GET, где я сериализуюсь. но во время десериализации, как это сделает reverese – user3214546

ответ

1

Я считаю, что пользовательское поле может быть полезным в этом случае.

class AgeField(serializers.WriteableField): 
    def to_native(self, age): 
     return age * 100 

    def from_native(self, age): 
     return int(age)/100 

class MySerializer(serializers.ModelSerializer): 
    age = AgeField(source='age') 

    def restore_object(self, attrs, instance=None): 
     """ 
     Deserialize a dictionary of attributes into an object instance. 
     You should override this method to control how deserialized objects 
     are instantiated. 
     """ 
     if instance is not None: 
      instance.update(attrs) 
      instance.update({'age', attrs['age']/100}) 
      return instance 
     return attrs 

class Meta: 
    model = MyModel 
    fields = ('field1', 'field2', 'age') 

В этом примере, скажем, что возраст 10. В вашем сериализаторе, вы показали бы следующее:

[ 
    { 
     "field1": "value", 
     "field2": "value", 
     "age" : 100 
    }, 
] 

Метод to_native покажет значение как 100, как форма на стр. Тем не менее, при отправке 100 в качестве значения будет вызываться from_native (с , являющимся юникодом), а затем делиться на 100, сохраняя в базе данных как 10. Это то, что вы ищете?

Или, если вы говорите о строго десериализации, код restore_object, скорее всего, то, что вы ищете в сочетании с to_native.

+0

, спасибо, поэтому я могу использовать либо настраиваемое поле, либо restore_object. я должен использовать оба – user3214546

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