【问题标题】:django rest framework serializer save() “got key error message”django rest 框架序列化程序 save() “得到关键错误消息”
【发布时间】:2017-07-31 06:26:18
【问题描述】:

很抱歉重新发布,但我在第一个问题中犯了很多错误,我认为如果我再次询问它,并提供更多细节和更少的解释错误会更好。


我正在尝试在我的自定义 django rest 框架序列化程序上使用 save 方法。
我在序列化程序中有一个 .create() 方法,我的 views.py 看起来像这样(简化):

def some_method():
    validated_data = {
        'id': some_integer_id,
        'created_at': "some text"}
    context_data = {
        'user': request.user.id}
    obj_serialized = MyCustomSerilizer(data=validated_data, context=context_data)
    if obj_serialized.is_valid():
        try:
            obj_serialized.save()
            print Response(obj_serialized.data)
            return Response(obj_serialized.data)
        except BaseException as e:
            raise APIException(detail=e.message)
    else:
        raise ValidationError(obj_serialized.errors)

这会返回一个异常:

在序列化程序“MyCustomSerializer”上尝试获取字段“created_at”的值时出现 KeyError。 序列化器字段可能命名不正确,并且与 `dict` 实例上的任何属性或键都不匹配。 原始异常文本为:u'created_at'。

这是我的序列化器:

class MyCustomSerializer(serializers.Serializer):
   id = serializers.IntegerField()
   created_at = serializers.CharField()

   def create(self, validated_data):
       print validated_data['created_at']
       user = self.context.get('user')
       return {'id': validated_data['id']}

create 方法的第一行正确打印 created_at 字段的值。我用 dict 发送的数据是 unicode,所以 dict 的键也变成了 unicode,但我怀疑是这种情况,因为我可以打印 valid_data['created_at']。
提前致谢。

【问题讨论】:

    标签: python django serialization unicode


    【解决方案1】:

    为什么您尝试返回不存在字段“消息”?可能需要改一下

        def create(self, validated_data):
            print validated_data['created_at']
            user = self.context.get('user')
            return {'id': validated_data['id'], 'created_at': validated_data['created_at']}
            #                                     ^^^^
    

    【讨论】:

    • 谢谢,这也是一个错误,但它与这个问题无关
    【解决方案2】:

    所以我找到了答案。问题其实出在这部分:

                print Response(obj_serialized.data)
                return Response(obj_serialized.data)
    

    由于某种原因,我之前没有渲染它。这对我的序列化程序的影响超出了我的范围。但是我通过删除打印行解决了这个问题,现在它可以工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 2014-10-09
      • 2020-12-28
      相关资源
      最近更新 更多