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:
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
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 useserializer.validated_data
para acceder a los datos antes de guardar.Deberíamos considerar una protección explícita contra este uso.