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

标签 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

一个保存过程:
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

最佳答案

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在请求数据中保存Animal随着Human .

引用 :
* PrimaryKeyRelatedField docs

关于Django REST Framework - SerializerMethodField 在 serializer.save() 上为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53726541/

相关文章:

python - API前端架构

python - 在 Django 的管理中保存模型时执行检查

python - 从 python 元组中的特定元素打印

python-3.x - 通过 Python3 和 Boto3 将 TTL 添加到 DynamoDB 记录

django - 如何在 Django rest 框架中执行删除操作?

python - 我如何处理追溯到杀死我的 worker 的段错误?

mysql - 问题 Django V 1.11.16 管理搜索无法处理所有数据

python - 使用DataBase和Dict添加菜单和触发器

python - Django Rest Framework 不会接受我的 CSRF token

permissions - 每个 View 的 Django Rest Framework 自定义权限