Django Rest Framework - Die geschachtelte Serialisierung funktioniert nicht wie erwartet

7

Beim Verwenden von Django-REST-Framework kann ich ausgewählte Felder in einem verschachtelten serialisierten Objekt nicht anzeigen.

Ich kann das gesamte Address -Modell korrekt serialisieren, aber ich möchte nur ein paar Felder von Address , die in meinem serialisierten Outlet verschachtelt sind. Es gibt ein

  

Habe AttributeError erhalten, als ich versuchte, einen Wert für das Feld outlet_address auf dem Serializer OutletSerializer zu erhalten.   Das Serializer-Feld wurde möglicherweise falsch benannt und entspricht keinem Attribut oder Schlüssel in der Outlet -Instanz.   Ursprünglicher Ausnahmetext war: 'Outlet' Objekt hat kein Attribut 'outlet_address'.

api_v1 / models.py

%Vor%

api_v1 / serializers.py

%Vor%

An dieser Stelle ist es nicht möglich, das outlet_address-Attribut im Outlet-Modell zu finden, während ich erwarte, dass es im Serializer möglich sein sollte.

  

Habe AttributeError bekommen, als ich versuchte einen Wert für das Feld zu bekommen    outlet_address auf dem Serializer OutletSerializer . Der Serializer   Das Feld könnte falsch benannt sein und keinem Attribut oder Schlüssel entsprechen   die Outlet -Instanz. Ursprünglicher Ausnahmetext war: "Outlet" -Objekt   hat kein Attribut 'outlet_address'.

Wie in anderen Antworten beschrieben, habe ich versucht:

  1. Hinzufügen von many= zum ModelSerializer
  2. Hinzufügen von related_name= zu allen Modellen
Pranab 20.10.2015, 03:07
quelle

3 Antworten

9

Versuchen Sie Folgendes:

%Vor%

Der Grund, warum ich die obigen Änderungen vornehmen würde, ist, dass das Outlet-Modell kein Attribut namens "outlet_address" hat, sondern ein Attribut namens "address".

Siehe hier für ein ähnliches Problem: Django Rest Framework hält Fehler bei geschachtelter Beziehung zurückgegeben

    
user2719875 20.10.2015, 06:45
quelle
7

Zusätzlich zu den anderen Antworten möchte ich Folgendes hinzufügen, falls jemand auch hier landet.

Bei der verschachtelten Serialisierung muss der Feldname in den Modellfeldern stehen, damit er funktioniert.

Falls wir eine umgekehrte Beziehung brauchen, dann natürlich dort wird kein solches Feld in den Modellfeldern sein.

Zum Beispiel würde dies bei den bestimmten Modellen in der Frage passieren, wenn wir alle Ausgänge im Adress-Serializer referenzieren müssten.

Daher müssen wir: (a) Entweder einen related_name für den Fremdschlüssel des anderen Modells angeben. An dieser Stelle würden wir outlet_address verwenden, da dies der verwandte Name des Adressfelds im Outlet-Modell ist.

Oder (b) Wenn kein verwandter Name verwendet wird, verwenden Sie den standardmäßigen Django-Namen, indem Sie _set an den Modellnamen anhängen (z. B. outlet_set .

    
Wtower 04.12.2015 11:32
quelle
3

Model Outlet hat ein "Adress" -Feld, keine outlet_Adresse. Ich würde empfehlen, Ihren Serializer wie folgt einzustellen:

%Vor%     
Roba 20.10.2015 06:42
quelle