2015-11-11 4 views
1

Я пытаюсь сохранить некоторую работу, используя метод create ModelSerializer в расширении класса, а затем добавив дополнительные поля, которые мне нужны в расширении. Когда я это делаю, я получаю сообщение от DRF о том, что не поддерживаю записываемые поля в вложенных сериализаторах. Есть ли способ реализовать это, так что мне не нужно явно определять каждое поле в методе create и вместо этого использовать эту работу над супер-конструктором? Включается мой код:Использование метода Super create для ModelSerializer

class CreateUserSerializer(ModelSerializer): 
    school = SchoolSerializer(required=False) 

    class Meta: 
     model = User 
     fields = ('id', 'username', 'password', 'first_name', 'last_name', 
       'user_type', 'school', 'email') 
     extra_kwargs = { 
      'password': {'write_only': True}, 
      'user_type': {'read_only': True} 
     } 

    def create(self, validated_data): 
     original_validated_data = validated_data.copy() 
     if 'password' in validated_data: 
      password = validated_data.pop('password') 

     user = super(CreateUserSerializer, self).create(validated_data) 
     if 'password' in original_validated_data: 
      user.set_password(original_validated_data['password']) 
     if 'school' in original_validated_data: 
      user.user_type = User.TYPE_ADVISOR 

     return user 

И это ошибка, что я получаю:

File "/serializers/user.py", line 41, in create 
    user = super(CreateUserSerializer, self).create(validated_data) 
File "/lib/python2.7/site-packages/rest_framework/serializers.py", line 832, in create 
    raise_errors_on_nested_writes('create', self, validated_data) 
File "/lib/python2.7/site-packages/rest_framework/serializers.py", line 724, in raise_errors_on_nested_writes 
    class_name=serializer.__class__.__name__ 
AssertionError: The `.create()` method does not support writable nestedfields by default. 
Write an explicit `.create()` method for serializer `api.serializers.user.CreateUserSerializer`, or set `read_only=True` on nested serializer fields. 

Я использую Rest Framework V3.3.1

ответ

6

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

Чтобы решить эту проблему, посмотрите на:

http://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers

3

create() метод не поддерживает записываемые nestedfields по умолчанию. Вы пытаетесь сохранить объект school в create(), позвонив по телефону super.

Вместо этого вы можете попробовать, как:

def create(self, validated_data): 
    original_validated_data = validated_data.copy() 
    if 'school' in validated_data: 
     school = validated_data.pop('school') 
     schoolObj = School.objects.create(**school) #Assuming your 'school' model name is School 

    if 'password' in validated_data: 
     password = validated_data.pop('password') 

    user = User.objects.create(school=schoolObj,**validated_data) 
    if 'password' in original_validated_data: 
     user.set_password(original_validated_data['password']) 
    if 'school' in original_validated_data: 
     user.user_type = User.TYPE_ADVISOR 

    user.save() 
    return user 
Смежные вопросы