首页 > 解决方案 > Django REST Framework - SerializerMethodField 在 serializer.save() 上为空

问题描述

我正在使用 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

一个保存过程:

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

标签: djangopython-3.xdjango-rest-framework

解决方案


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'
        )

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

参考
* PrimaryKeyRelatedField 文档


推荐阅读