ModelSerializer utilisant la propriété de modèle


95

J'essaie de sérialiser un modèle contenant un champ de propriété que je souhaite également sérialiser.

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

Lorsque j'essaye d'accéder à l'URL associée, j'obtiens une exception de sérialiseur (KeyError) sur la ext_linkpropriété.

Comment puis-je sérialiser la ext_linkpropriété?

Réponses:


135

Comme ce n'est pas un champ de modèle, il doit être ajouté explicitement à la classe de sérialiseur

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

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

5
Une remarque : la liste des champs dans Meta est facultative. Si vous omettezfields, dans l'exemple ci-dessus, vous obtiendrez tous lesMyModelchamps plusext_linkdans les données sérialisées. Et c'est vraiment génial pour les modèles complexes! EDIT : Au moins, c'est vrai pourdjangorestframework==2.3.14.
e.thompsy

Pour moi, l'utilisation de sérialiseurs.Field a donné une erreur. "serializers.ReadOnlyField" fonctionne si to_representation n'est pas défini et que la vue est en lecture seule.
Shashank Singla

13
J'utilise 3.3.x et ajouter simplement des propriétés aux champs n'est pas suffisant. Je dois encore ajouter explicitement via ext_link = serializers.ReadOnlyField ().
jarmod

4
en utilisant DRF 3.4.6 sur Python 3.5.1 et Django 1.10, l'ajout de champs fonctionne très bien.
Vaibhav Mishra

9
Remarque: en utilisant, fields = "__all__"j'ai également dû ajouter myfield = serializers.ReadOnlyField()comme jarmod spécifié, en utilisant la version 3.7.7
Robert Townley

20

comme @Robert Townleycommentaire, cela fonctionne avec la version 3.8.2:

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

    class Meta:
        model = MyModel
        fields = "__all__"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.