Ich möchte ein Modell serialisieren, möchte jedoch ein zusätzliches Feld einfügen, in dem einige Datenbanksuchen für die zu serialisierende Modellinstanz durchgeführt werden müssen:
class FooSerializer(serializers.ModelSerializer):
my_field = ... # result of some database queries on the input Foo object
class Meta:
model = Foo
fields = ('id', 'name', 'myfield')
Was ist der richtige Weg, um dies zu tun? Ich sehe, dass Sie zusätzlichen "Kontext" an den Serializer übergeben können. Ist die richtige Antwort, um das zusätzliche Feld in einem Kontextwörterbuch zu übergeben? Bei diesem Ansatz wäre die Logik zum Abrufen des von mir benötigten Felds nicht in der Serializer-Definition enthalten, was ideal ist, da jede serialisierte Instanz benötigt wird my_field
. An anderer Stelle in der Dokumentation zu DRF-Serialisierern heißt es : "Zusätzliche Felder können jeder Eigenschaft entsprechen oder im Modell aufgerufen werden können." Sind es zusätzliche Felder, über die ich spreche? Sollte ich in Foo
der Modelldefinition eine Funktion definieren, die einen my_field
Wert zurückgibt , und im Serializer my_field mit diesem aufrufbaren Element verbinden? Wie sieht das aus?
Vielen Dank im Voraus, gerne klären Sie die Frage, falls erforderlich.
field_name = serializers.SerializerMethodField()
unddef get_field_name(self, obj):
foo
wenn ein SerializerMethodField def? Wenn Sie CreateAPIView verwenden, wird das foo gespeichert und kann dann die Methode is_named_bar () verwendet werden?Mit diesem Ansatz können Sie Ihre Modellmethode in Eigenschaft ändern und im Serializer verwenden.
Bearbeiten: Mit den neuesten Versionen des Rest Frameworks (ich habe 3.3.3 ausprobiert) müssen Sie nicht zur Eigenschaft wechseln. Die Modellmethode funktioniert einwandfrei.
quelle
variable = model_instance.my_field
das gleiche Ergebnis wievariable = model_instance.my_field()
ohne den Dekorateur. auch: stackoverflow.com/a/6618176/2198571source='my_field'
wird nicht mehr benötigt und eine AusnahmeBei der letzten Version von Django Rest Framework müssen Sie in Ihrem Modell eine Methode mit dem Namen des Felds erstellen, das Sie hinzufügen möchten. Keine Notwendigkeit
@property
undsource='field'
Fehler auslösen.quelle
request
Objekt in def foo (self) haben möchte, das den Wert von foo ändern könnte? (Beispiel eine request.user-basierte Suche)Meine Antwort auf eine ähnliche Frage ( hier ) könnte nützlich sein.
Wenn Sie eine Modellmethode wie folgt definiert haben:
Sie können das Ergebnis des Aufrufs dieser Methode wie folgt zu Ihrem Serializer hinzufügen:
ps Da das benutzerdefinierte Feld in Ihrem Modell nicht wirklich ein Feld ist, möchten Sie es normalerweise schreibgeschützt machen, wie folgt:
quelle
Wenn Sie in Ihrem zusätzlichen Feld lesen und schreiben möchten, können Sie einen neuen benutzerdefinierten Serializer verwenden, der die Serializer erweitert. Serializer, und ihn wie folgt verwenden
Ich benutze dies in verwandten verschachtelten Feldern mit einer benutzerdefinierten Logik
quelle
In model.py
** **.
** **.
** **.
quelle
Wie Chemical Programer in diesem Kommentar sagte , können Sie es in der neuesten DRF einfach so machen:
DRF-Dokumentquelle
quelle