Django REST Framework - SerializerMethodField 在serializer.save() 上为空

nar*_*upo 5 django python-3.x django-rest-framework

我正在使用 Django 和 REST 框架。我想用序列化器按数据保存。我打电话给serializer.save(). 但保存的模型字段为空,animal字段为HumanSerializer. 我想要定义animal字段SerializerMethodField并想要保存模型。怎么做?

序列化器:

class HumanSerializer(serializers.ModelSerializer):

    animal = SerializerMethodField()

    class Meta:
        model = Human
        fields = (
            'id',
            'animal', # <- animal is ForeignKey of Animal model
        )

    def get_animal(self, lead):
        # blah blah blah
        pass
Run Code Online (Sandbox Code Playgroud)

保存过程:

data['animal'] = 1
serializer = HumanSerializer(
    data=data,
    context={'request': request},
)
if serializer.is_valid():
    human = serializer.save()
    human.animal # <- animal is null. but delete SerializerMethodField then not null
Run Code Online (Sandbox Code Playgroud)

Sac*_*hin 4

SerializerMethodField始终是只读字段。您可以出于书写目的添加另一个字段。

例子

class HumanSerializer(serializers.ModelSerializer):

    animal = SerializerMethodField()
    animal_id = serializers.PrimaryKeyRelatedField(
        source='animal',
        queryset=Animal.objects.all(),
        write_only=True
    )

    class Meta:
        model = Human
        fields = (
            'id',
            'animal',
            'animal_id'
        )
Run Code Online (Sandbox Code Playgroud)

然后,传入animal_id请求数据以将其AnimalHuman.

参考
* PrimaryKeyRelatedField 文档