Использование метода Super Create для ModelSerializer
Я пытаюсь сохранить некоторую работу, используя метод create ModelSerializer в расширении класса, а затем добавляя дополнительные поля, которые мне нужны в расширении. Однако, когда я делаю это, я получаю ошибку от DRF о том, что не поддерживается запись полей во вложенных сериализаторах. Есть ли способ реализовать это так, чтобы мне не приходилось явно определять каждое поле в методе create, а вместо этого помещать эту работу в супер-конструктор? Включен мой код:
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
2 ответа
Я не думаю, что это сработает, так как вызов super эффективно означает, что вы вызываете базовый метод, который согласно документации не поддерживает написание вложенных моделей.
Чтобы решить эту проблему, взгляните на:
create()
Метод не поддерживает доступные для записи вложенные поля по умолчанию. Вы пытаетесь спасти 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