Django-rest-framework: AttributeError: el objeto 'OrderedDict' no tiene atributo 'pk'

Creado en 24 may. 2015  ·  4Comentarios  ·  Fuente: encode/django-rest-framework

puntos de vista:

@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']:

serializadores:

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()

Cuando intento imprimir el serializador:

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

Entonces, cada vez que intento acceder a serializer.data, obtengo una excepción:

AttributeError: el objeto 'OrderedDict' no tiene atributo '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:

Comentario más útil

La propiedad serializer.data solo es válida si tiene una instancia guardada en el serializador.
Llame a serializer.save() o use serializer.validated_data para acceder a los datos antes de guardar.
Deberíamos considerar una protección explícita contra este uso.

Todos 4 comentarios

La propiedad serializer.data solo es válida si tiene una instancia guardada en el serializador.
Llame a serializer.save() o use serializer.validated_data para acceder a los datos antes de guardar.
Deberíamos considerar una protección explícita contra este uso.

También encontré esto usando el decorador detail_route para un propósito similar. Tomó mucho tiempo darse cuenta de lo que estaba pasando. Sería útil si hubiera una protección contra esto que indicara su respuesta anterior de 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 El error actual aquí es al acceder a data por lo que no podemos decir "Llamar a serializer.save() o usar serializer.validated_data para acceder a la fecha antes de guardar". ya que el último no funciona de todos modos en ese caso.

Editado.

La pregunta es: ¿queremos que data se llene con validated_data si no hay errores?
Creo que podríamos eliminar, por desaprobación, las líneas 224/225 en https://github.com/tomchristie/django-rest-framework/blob/8d7c0a8474583df6b27d0d5be8a84bd9a154ab35/rest_framework/serializers.py#L224

¿Fue útil esta página
0 / 5 - 0 calificaciones