2015-10-08 11 views
5

Appena entrato in Django Rest Framework.Incluso il valore get_absolute_url nell'output JSON

Ho un semplice esempio di esecuzione in cui un modello viene presentato tramite l'API REST. Non ci sono campi correlati nel modello, solo un gruppo di stringhe.

Qual è il modo più semplice per presentare il valore get_absolute_url() di quel modello nell'output JSON?

Sto utilizzando serializers.HyperlinkedModelSerializer in preparazione per lo spostamento in modelli più complessi che hanno campi correlati.

+0

Ho trovato molte risposte in questo [post pertinente] (http://stackoverflow.com/questions/18396547/django-rest-framework-adding-additional-field-to-modelserializer) – SimonMorris

risposta

6

Approccio-1 Utilizzando un SerializerMethodField:

è possibile utilizzare un SerializerMethodField nel vostro serializzatore per aggiungere il valore get_absolute_url() alla rappresentazione serializzata dell'oggetto.

Come per la SerializerMethodField docs:

Questo è un campo di sola lettura. Ottiene il suo valore chiamando un metodo su la classe serializzatore a cui è collegata. Può essere utilizzato per aggiungere qualsiasi tipo di dati alla rappresentazione serializzata del proprio oggetto.

Noi definire un metodo get_my_abslute_url() per il campo my_absolute_url nel nostro serializzatore che aggiungerà l'URL assoluto dell'oggetto alla rappresentazione serializzata.

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 

Approccio-2 Uso URLField con source argomento:

È possibile anche utilizzare un URLField e passare il metodo di get_absolute_url ad esso. Questo chiamerà il metodo get_absolute_url e restituirà quel valore nella rappresentazione serializzata.

Da docs DRF su source argument:

Il nome dell'attributo che verrà utilizzato per compilare il campo. Può essere un metodo che richiede solo un self argument, come URLField('get_absolute_url'), oppure può utilizzare la notazione punteggiata per attraversare attributi, come EmailField(source='user.email').

class MyModelSerializer(serializers.ModelSerializer): 

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

Io suggerirei di usare il secondo metodo come DRF ha utilizzato esplicitamente nei suoi documenti.

+0

Ottima risposta - grazie così tanto – SimonMorris