Django-rest-framework: AttributeError:“OrderedDict”对象没有属性“pk”

创建于 2015-05-24  ·  4评论  ·  资料来源: encode/django-rest-framework

意见:

@detail_route(methods=['post'])
def quote(self, request, pk):
    task = self.get_object()

    serializer = serializers.TaskCreateQuoteSerializer(data=request.DATA, task=task)

    if not serializer.is_valid():
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    # this causes a problem
    serializer.data['servicetasks']:

序列化器:

class TaskCreateQuoteSerializer(serializers.Serializer):
    servicetasks = serializers.PrimaryKeyRelatedField(many=True, required=True, allow_null=False,
        queryset=ServiceTask.objects.all())

    def __init__(self, task, *args, **kwargs):
        super(TaskCreateQuoteSerializer, self).__init__(*args, **kwargs)
        # print task.servicetask_set.all()
        # self.fields['servicetasks'].queryset = task.servicetask_set.all()

当我尝试打印序列化程序时:

TaskCreateQuoteSerializer(data={u'servicetasks': [3115, 3114]}, task=<Task: E13/688 COMPLETE>):
    servicetasks = PrimaryKeyRelatedField(allow_null=False, many=True, queryset=[<ServiceTask: Ser...]

因此,每当我尝试访问 serializer.data 时,都会出现异常:

AttributeError:“OrderedDict”对象没有属性“pk”

Traceback:
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
  57.         return view_func(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/rest_framework/viewsets.py" in view
  85.             return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/rest_framework/views.py" in dispatch
  452.             response = self.handle_exception(exc)
File "/usr/local/lib/python2.7/site-packages/rest_framework/views.py" in dispatch
  449.             response = handler(request, *args, **kwargs)
File "/usr/src/app/abas/apps/api/views.py" in quote
  270.         if not serializer.data['servicetasks']:
File "/usr/local/lib/python2.7/site-packages/rest_framework/serializers.py" in data
  466.         ret = super(Serializer, self).data
File "/usr/local/lib/python2.7/site-packages/rest_framework/serializers.py" in data
  215.                 self._data = self.to_representation(self.validated_data)
File "/usr/local/lib/python2.7/site-packages/rest_framework/serializers.py" in to_representation
  426.                 attribute = field.get_attribute(instance)
File "/usr/local/lib/python2.7/site-packages/rest_framework/relations.py" in get_attribute
  364.         if not instance.pk:

最有用的评论

serializer.data 属性仅在您将实例保存到序列化程序时才有效。
在保存之前调用serializer.save()或使用serializer.validated_data访问数据。
我们应该考虑明确防范这种用法。

所有4条评论

serializer.data 属性仅在您将实例保存到序列化程序时才有效。
在保存之前调用serializer.save()或使用serializer.validated_data访问数据。
我们应该考虑明确防范这种用法。

我也遇到了这种情况,使用 detail_route 装饰器用于类似目的。 花了很长时间才弄清楚发生了什么事。 如果有一个防范措施说明您之前的回应是The serializer.data property is only valid if you have a saved instance to serializer. Either call serializer.save() or use serializer.validated_data to access date prior to saving. ,那将会很有帮助

@tomchristie这里的当前错误是在访问data时,所以我们不能说“在保存之前调用 serializer.save() 或使用 serializer.validated_data 访问日期。” 因为在这种情况下后者无论如何都不起作用。

已编辑。

问题是:如果没有错误,我们是否希望datavalidated_data填充。
我认为我们可以通过弃用删除https://github.com/tomchristie/django-rest-framework/blob/8d7c0a8474583df6b27d0d5be8a84bd9a154ab35/rest_framework/serializers.py#L224的第 224/225 行

此页面是否有帮助?
0 / 5 - 0 等级