ModelSerializer verwendet die Modelleigenschaft


93

Ich versuche, ein Modell zu serialisieren, das ein Eigenschaftsfeld enthält, das ich auch serialisieren möchte.

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')

Beim Versuch, zur zugehörigen URL zu gelangen, wird eine Serializer-Ausnahme (KeyError) für die ext_linkEigenschaft angezeigt .

Wie kann ich die ext_linkEigenschaft serialisieren ?

Antworten:


131

Da es sich nicht um ein Modellfeld handelt, muss es explizit zur Serializer-Klasse hinzugefügt werden

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

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

5
Ein Hinweis : Die Feldliste in Meta ist optional. Wenn Siefieldsim obigen Beispielweglassen, erhalten Sie alleMyModelFelder plusext_linkin den serialisierten Daten. Und das ist wirklich großartig für komplexe Modelle! EDIT : Zumindest gilt dies fürdjangorestframework==2.3.14.
— e.thompsy

Für mich hat die Verwendung von Serializern.Field einen Fehler gegeben. "serializers.ReadOnlyField" funktioniert, wenn to_representation nicht definiert und die Ansicht schreibgeschützt ist.
— Shashank Singla

13
Ich verwende 3.3.x und das einfache Hinzufügen von Eigenschaften zu Feldern reicht nicht aus. Ich muss noch explizit über ext_link = serializers.ReadOnlyField () hinzufügen.
— Jarmod

4
Wenn Sie DRF 3.4.6 unter Python 3.5.1 und Django 1.10 verwenden, funktioniert das Hinzufügen zu Feldern einwandfrei.
— Vaibhav Mishra

9
Hinweis: Mit fields = "__all__"Ich musste auch myfield = serializers.ReadOnlyField()als Jarmod angegeben hinzufügen , mit Version 3.7.7
— Robert Townley

18

als @Robert TownleyKommentar funktioniert diese mit Version 3.8.2:

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

    class Meta:
        model = MyModel
        fields = "__all__"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.