【问题标题】:Django Serializer POST data not fully passed to serializerDjango Serializer POST 数据未完全传递给序列化程序
【发布时间】:2018-11-09 09:30:41
【问题描述】:

我有以下序列化程序定义:

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)

以及在视图集中的用法

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

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

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

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

duplicate key value violates unique constraint

在创建方法中打印data 时,上下文根本不存在。

【问题讨论】:

  • 鉴于您使用的是ModelViewSetPOST 请求确实会尝试使用1 创建一个新条目作为id。如果 ID 为 1 的条目已存在,则这是不可能的。要更新,您需要向详细路线发送PATCH 请求。 /api/test/1/

标签: python django rest django-rest-framework serialization


【解决方案1】:

鉴于您使用的是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)

如果您希望正确完成,还有更多内容。在不确切知道您要做什么以及原因的情况下,我不想提出一个完整的解决方案。但是,您可以使用未经 request 验证的数据来完成您想做的工作。

【讨论】:

  • 感谢 PATCH 成功了;但是,在update 方法中,contexts 仍然不存在!?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 2021-11-08
  • 2011-12-09
相关资源
最近更新 更多