Django-rest-framework: AttributeError: 'OrderedDict'-Objekt hat kein Attribut 'pk'

Erstellt am 24. Mai 2015  ·  4Kommentare  ·  Quelle: encode/django-rest-framework

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:

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 verwenden serializer.validated_data , um vor dem Speichern auf Daten zuzugreifen.
Wir sollten einen ausdrücklichen Schutz gegen diese Verwendung in Betracht ziehen.

Alle 4 Kommentare

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen