python - Django Serializer POST 数据未完全传递给序列化器

标签 python django rest django-rest-framework serialization

我有以下序列化器定义:

class TestSerializer(serializers.ModelSerializer):
    contexts = serializers.SerializerMethodField()

    class Meta:
        model = Test
        fields = (
            "id",
            "contexts"
        )

    def get_contexts(self, obj):
       return ...

    def create(self, data):
        print('CREATE')
        print(data)
        return super().create(data)

    def update(self, instance, validated_data):
        print('UPDATE')
        print(validated_data)
        return super().update(instance, validated_data)

并在 View 集中使用此类

serializer_class = TestSerializer
queryset = Test.objects.all()

请注意,contexts 字段不是数据库字段。当使用 GET 访问端点时,我使用

正确接收信息
 {
     "id": 1,
     "contexts": [{...}]
 }

但是当将相同的数据作为 POST 发送回来时,就会出现两个问题。第一个序列化器似乎无法关联正确的数据集,因为我总是在导致错误的 create 方法中结束

duplicate key value violates unique constraint

并且在创建方法中打印数据时,上下文根本不存在。

最佳答案

假设您正在使用 ModelViewSet 并已在网址上注册它:/api/test/...

诸如您所描述的请求之类的 POST 请求确实会尝试创建一个以 1 作为 id 的新条目。如果具有 id 1 的条目已存在,则这是不可能的。

要更新,您需要向详细路由发送 PATCH 请求。 /api/test/1/

编辑

SerializerMethodField 是只读的,不会显示在 validated_data 中。您可以在 self.context['request'].data.get('contexts') 中访问它。但我建议为该领域创建另一个序列化器......

class ContextsSerializer(serializers.Serializer):
    class Meta:
        fields = (...)

class TestSerializer(serializers.ModelSerializer):
    contexts = ContextsSerializer(many=False)

如果您希望正确完成此操作,还有更多内容。如果不确切知道您要做什么以及为什么,我不想提出完整的解决方案。但您可以使用未经请求验证的数据来完成您想要执行的操作。

关于python - Django Serializer POST 数据未完全传递给序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53223041/

相关文章:

javascript - 如何加密 REST API 身份验证的密码

java - SSL 和验证用户

python - 如何在 Python 解释器中重新导入更新的包?

python - 使用函数关闭pygame窗口

python - 阻止在python中读取文件

c++ - 在 PySide (Qt) 中打开另一个程序并在原始窗口中显示

python - Django 博客生成下一个/上一个条目

python - 为什么我不能访问 Meta 类作为 Django 模型类的属性?

django - Django 的身份验证应用程序

javascript - 拥有公共(public) API,但只允许访问从我的网站发送的请求