Django Rest-Framework, wie '__all__' Felder und ein verwandtes Feld in ModelSerializer enthalten?

8

Ich habe zwei Modelle, eines mit M2M-Beziehung und einen verwandten Namen. Ich möchte alle Felder in den Serializer und das zugehörige Feld einfügen.

models.py:

%Vor%

serializer.py:

%Vor%

Dies funktioniert, aber es enthält das zugehörige Feld nicht.

%Vor%

Das funktioniert genau so, wie ich es möchte, aber was passiert, wenn das Toppings-Modell viele Felder hat. Ich möchte etwas tun wie:

%Vor%

Diese Syntax führt zu einem Fehler, der besagt:

  

Der Feldname __all__ ist für Modell

nicht gültig

Gibt es eine Möglichkeit, das gewünschte Verhalten zu erreichen? Oder die Felder müssen manuell eingegeben werden, wenn Sie einen verwandten Namen verwenden?

    
Curtwagner1984 07.07.2016, 12:24
quelle

4 Antworten

6

Ich habe gerade den Quellcode von Django Rest Framework überprüft. Das gewünschte Verhalten scheint im Framework nicht unterstützt zu werden.

Die Option fields muss eine Liste, ein Tupel oder der Text __all__ sein.

Hier ist ein Ausschnitt des relevanten Quellcodes:

%Vor%

Sie können ' all ' nicht zusätzlich zum Tupel oder der Liste mit Feldern hinzufügen ...

    
DanEEStar 01.11.2016, 15:42
quelle
14

Wie @DanEEStart sagte, DjangoRestFramework habe keine einfache Möglichkeit, den ' all ' Wert für Felder zu erweitern, da die get_field_names -Methoden so entworfen zu sein scheinen So funktioniert .

Aber glücklicherweise können Sie diese Methode überschreiben, um einen einfachen Weg zu ermöglichen, alle Felder und Relationen aufzunehmen, ohne eine Unmenge von Feldern aufzählen zu müssen.

Ich überschreibe diese Methode wie folgt:

%Vor%

Beachten Sie, dass diese Methode nur das Verhalten dieses Serializers ändert und das extra_fields -Attribut nur für diese Serialisierungsklasse funktioniert.

Wenn Sie so viele Serializer haben, können Sie eine Zwischenklasse erstellen, um diese get_fields_names -Methode an einer Stelle einzufügen und mehrfach zu verwenden. Manche mögen das:

%Vor%     
hugoruscitti 09.12.2016 15:20
quelle
2

Ein altes Problem, aber dachte, dass dies anderen in der Zukunft helfen könnte.

Ich habe gerade ein ähnliches Problem festgestellt und die Option all aktiviert, indem ich ein zusätzliches Feld wie im folgenden Beispiel manuell angegeben habe. Ich bin mir nicht sicher, ob dies auch Ihr Problem lösen würde. Es ist ein verdammt sauberer Anblick als alles, was ich bisher gesehen habe.

Ссылка

%Vor%

Ich würde annehmen, dass dies für alle anderen verwandten Feldoptionen funktionieren würde, die auf derselben Seite aufgeführt sind: Ссылка

Ich benutze das Django Rest Framework Version 3.6.2

Umgekehrtes Beziehungsbeispiel wie angefordert:

%Vor%     
Aiky30 31.08.2017 17:53
quelle
1

Um alle Felder und die anderen in Ihrem Serializer definierten Felder einzubeziehen, können Sie einfach exclude = ()

sagen %Vor%

Dies listet alle Feldwerte mit dem zusätzlichen Argument pizzas auf

    
riyasyash 13.12.2017 09:19
quelle