Ich habe ein ModelSerializer
Feld erstellt und möchte ein benutzerdefiniertes Feld hinzufügen, das nicht Teil meines Modells ist.
Ich habe hier eine Beschreibung zum Hinzufügen zusätzlicher Felder gefunden und Folgendes versucht:
customField = CharField(source='my_field')
Wenn ich dieses Feld hinzufüge und meine validate()
Funktion aufrufe, ist dieses Feld nicht Teil des attr
Diktats. attr
enthält alle angegebenen Modellfelder mit Ausnahme der zusätzlichen Felder. Ich kann also in meiner überschriebenen Validierung nicht auf dieses Feld zugreifen, oder?
Wenn ich dieses Feld wie folgt zur Feldliste hinzufüge:
class Meta:
model = Account
fields = ('myfield1', 'myfield2', 'customField')
dann erhalte ich eine Fehlermeldung, weil sie customField
nicht Teil meines Modells ist - was ist richtig, weil ich sie nur für diesen Serializer hinzufügen möchte.
Gibt es eine Möglichkeit, ein benutzerdefiniertes Feld hinzuzufügen?
Antworten:
Sie tun das Richtige, außer dass
CharField
(und die anderen eingegebenen Felder) für beschreibbare Felder sind.In diesem Fall möchten Sie nur ein einfaches schreibgeschütztes Feld. Verwenden Sie stattdessen einfach:
quelle
.validate()
das Attribut mithilfe der Methode entfernen. Siehe: django-rest-framework.org/api-guide/serializers.html#validation Das würde tun, was Sie brauchen, obwohl ich den Anwendungsfall nicht wirklich verstehe oder warum Sie ein beschreibbares Feld wollen, das an a gebunden ist schreibgeschützte Eigenschaftget_absolute_url
?get_absolute_url
ich gerade aus den Dokumenten kopiert und eingefügt habe. Ich möchte nur ein normales beschreibbares Feld, auf das ich im zugreifen kannvalidate()
. Ich habe nur vermutet, dass ich dassource
Attribut brauchen würde ...In der Tat gibt es eine Lösung, ohne das Modell überhaupt zu berühren. Sie können verwenden, mit
SerializerMethodField
denen Sie eine beliebige Methode an Ihren Serializer anschließen können.quelle
SerializerMethodField
nicht... aus Gründen der Übersichtlichkeit, 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
perform_create(self, serializer)
,perform_update(self, serializer)
,perform_destroy(self, instance)
.Hier Antwort auf Ihre Frage. Sie sollten Ihrem Modellkonto Folgendes hinzufügen:
Jetzt können Sie verwenden:
Quelle: https://stackoverflow.com/a/18396622/3220916
quelle
Zu zeigen
self.author.full_name
, ich habe einen Fehler mitField
. Es funktionierte mitReadOnlyField
:quelle
Bei 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.
quelle
Ich suchte nach einer Lösung zum Hinzufügen eines beschreibbaren benutzerdefinierten Felds zu einem Modell-Serialisierer. Ich habe diesen gefunden, der in den Antworten auf diese Frage nicht behandelt wurde.
Es scheint, als müssten Sie tatsächlich Ihren eigenen einfachen Serializer schreiben.
Jetzt können Sie diesen Serializer verwenden, um einem ModelSerializer benutzerdefinierte Felder hinzuzufügen
Dies funktioniert auch, wenn das Modell
MyModel
tatsächlich eine Eigenschaft namens hatmy_custom_field
, Sie jedoch die Validatoren ignorieren möchten.quelle
Nachdem ich alle Antworten hier gelesen habe, bin ich zu dem Schluss gekommen, dass es unmöglich ist, dies sauber zu machen. Sie haben schmutzig zu spielen und etwas hadkish zu tun wie ein WRITE_ONLY Feld zu erzeugen und dann die außer Kraft setzen
validate
undto_representation
Methoden. Das hat bei mir funktioniert:quelle