Ansichten:
@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']:
Serialisierer:
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()
Wenn ich versuche, den Serializer zu drucken:
TaskCreateQuoteSerializer(data={u'servicetasks': [3115, 3114]}, task=<Task: E13/688 COMPLETE>):
servicetasks = PrimaryKeyRelatedField(allow_null=False, many=True, queryset=[<ServiceTask: Ser...]
Wenn ich also versuche, auf serializer.data zuzugreifen, erhalte ich eine Ausnahme:
AttributeError: 'OrderedDict'-Objekt hat kein Attribut '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:
Die Eigenschaft serializer.data ist nur gültig, wenn Sie über eine gespeicherte Instanz des Serializers verfügen.
Rufen Sie entweder serializer.save()
an oder verwenden serializer.validated_data
, um vor dem Speichern auf Daten zuzugreifen.
Wir sollten einen ausdrücklichen Schutz gegen diese Verwendung in Betracht ziehen.
Ich bin auch darauf gestoßen, als ich den detail_route-Decorator für einen ähnlichen Zweck verwendet habe. Es dauerte lange, bis ich herausfand, was los war. Es wäre hilfreich, wenn es einen Schutz davor gäbe, der Ihre vorherige Antwort von 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 Der aktuelle Fehler hier tritt beim Zugriff auf data
, sodass wir nicht sagen können: "Entweder rufen Sie serializer.save() auf oder verwenden Sie serializer.validated_data, um vor dem Speichern auf das Datum zuzugreifen." da letzteres in diesem Fall sowieso nicht funktioniert.
Bearbeitet.
Die Frage ist: Soll data
mit validated_data
gefüllt werden, wenn keine Fehler vorhanden sind.
Ich denke, wir könnten – durch Verwerfung – die Zeilen 224/225 unter https://github.com/tomchristie/django-rest-framework/blob/8d7c0a8474583df6b27d0d5be8a84bd9a154ab35/rest_framework/serializers.py#L224 entfernen
Hilfreichster Kommentar
Die Eigenschaft serializer.data ist nur gültig, wenn Sie über eine gespeicherte Instanz des Serializers verfügen.
Rufen Sie entweder
serializer.save()
an oder verwendenserializer.validated_data
, um vor dem Speichern auf Daten zuzugreifen.Wir sollten einen ausdrücklichen Schutz gegen diese Verwendung in Betracht ziehen.