2

クラスの拡張で ModelSerializer の create メソッドを使用し、拡張に必要な追加フィールドを追加することで、いくつかの作業を節約しようとしています。ただし、これを行うと、ネストされたシリアライザーで書き込み可能なフィールドをサポートしていないという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 を使用しています

4

2 に答える 2

6

スーパーを効果的に呼び出すことは、ドキュメントによるとネストされたモデルの作成をサポートしていない基本メソッドを呼び出すことを意味するため、うまくいくとは思いません。

これを解決するには、以下をご覧ください。

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

于 2015-11-11T20:31:25.673 に答える
4

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
于 2015-11-13T08:59:00.523 に答える