2015-10-08 9 views
5

Nur in Django Rest Framework.Einschließlich der get_absolute_url Wert in JSON-Ausgabe

Ich habe ein einfaches Beispiel ausgeführt, in dem ein Modell über die REST API präsentiert wird. Es gibt keine verwandten Felder im Modell, nur eine Reihe von Strings.

Was ist der einfachste Weg, den get_absolute_url() Wert dieses Modells in den JSON-Ausgang zu bringen?

Ich benutze serializers.HyperlinkedModelSerializer in Vorbereitung für den Umzug in kompliziertere Modelle, die verwandte Felder haben.

+0

Ich fand eine Menge der Antwort in diesem [relevanten Beitrag] (http://stackoverflow.com/questions/18396547/django-rest-framework-adding-additional-field-to-modelserializer) – SimonMorris

Antwort

6

Ansatz-1 Mit einem SerializerMethodField:

Sie ein SerializerMethodField in Ihrem Serializer verwenden kann den get_absolute_url() Wert auf die serialisierte Darstellung des Objekts hinzuzufügen.

Gemäß der SerializerMethodField docs:

Dies ist ein Nur-Lese-Feld. Es erhält seinen Wert, indem es eine Methode auf die Serializer-Klasse aufruft, an die es angehängt ist. Es kann verwendet werden, um eine beliebige Art von Daten zu der serialisierten Darstellung Ihres Objekts hinzuzufügen.

Wir werden ein Verfahren get_my_abslute_url() für das my_absolute_url Feld in unserem Serializer definieren, die die absolute URL des Objekts in der serialisierte Darstellung hinzufügen.

class MyModelSerializer(serializers.ModelSerializer): 

    my_absolute_url = serializers.SerializerMethodField() # define a SerializerMethodField   

    def get_my_absolute_url(self, obj): 
     return obj.get_absolute_url() # return the absolute url of the object 

Ansatz-2 Mit URLField mit source Argument:

Sie auch eine URLField und übergeben Sie die Methode get_absolute_url, um es verwenden können. Dies ruft die Methode get_absolute_url auf und gibt diesen Wert in der serialisierten Darstellung zurück.

Von DRF docs auf source argument:

Der Name des Attributs, das verwendet wird, um das Feld zu füllen. Mai ein Verfahren sein, das eine self argument dauert nur, wie URLField('get_absolute_url') oder punktierten Notation kann Attribute wie EmailField(source='user.email') zu durchqueren.

class MyModelSerializer(serializers.ModelSerializer): 

    my_absolute_url = serializers.URLField(source='get_absolute_url', read_only=True) 

Ich würde vorschlagen, den zweiten Ansatz als DRF mit hat dies in seiner docs explizit verwendet.

+0

Große Antwort - danke so sehr – SimonMorris

Verwandte Themen