ModelSerializer utilizzando la proprietà del modello


95

Sto cercando di serializzare un modello contenente un campo di proprietà che voglio anche serializzare.

models.py:

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    slug = models.AutoSlugField(populate_from='name')

    @property
    def ext_link(self):
        return "/".join([settings.EXT_BASE_URL, self.slug])

serializers.py:

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')

Quando provo ad accedere all'URL correlato, ricevo un'eccezione del serializzatore (KeyError) sulla ext_linkproprietà.

Come posso serializzare la ext_linkproprietà?

Risposte:


134

Poiché non è un campo modello, deve essere aggiunto in modo esplicito alla classe serializzatore

class MyModelSerializer(serializers.ModelSerializer):
    ext_link = serializers.Field()

    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')

5
Una nota : l'elenco dei campi in Meta è facoltativo. Se omettifields, nell'esempio precedente, otterrai tutti iMyModelcampi piùext_linki dati serializzati. E questo è davvero fantastico per i modelli complessi! EDIT : Almeno, questo è vero perdjangorestframework==2.3.14.
e.thompsy

Per me, l'utilizzo dei serializzatori.Field ha dato un errore. "serializers.ReadOnlyField" funziona se to_representation non è definito e la vista è di sola lettura.
Shashank Singla

13
Sto usando 3.3.xe la semplice aggiunta di proprietà ai campi non è sufficiente. Devo ancora aggiungere esplicitamente tramite ext_link = serializers.ReadOnlyField ().
jarmod

4
utilizzando DRF 3.4.6 su Python 3.5.1 e Django 1.10, l'aggiunta ai campi funziona bene.
Vaibhav Mishra

9
Nota: utilizzando fields = "__all__"ho anche dovuto aggiungere myfield = serializers.ReadOnlyField()come specificato jarmod, utilizzando la versione 3.7.7
Robert Townley,

20

come @Robert Townleycommento di, funziona con la versione 3.8.2:

class MyModelSerializer(serializers.ModelSerializer):
    ext_link = serializers.ReadOnlyField()

    class Meta:
        model = MyModel
        fields = "__all__"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.