115 votes

Django Rest Framework - Comment ajouter un champ personnalisé dans ModelSerializer ?

J'ai créé un ModelSerializer et je veux ajouter un champ personnalisé qui ne fait pas partie de mon modèle.

J'ai trouvé une description pour ajouter des champs supplémentaires aquí et j'ai essayé ce qui suit :

customField = CharField(source='my_field')

Lorsque j'ajoute ce champ et que j'appelle mon validate() alors ce champ ne fait pas partie de la fonction attr dict. attr contient tous les champs du modèle spécifiés, sauf les champs supplémentaires. Je ne peux donc pas accéder à ce champ dans ma validation écrasée, n'est-ce pas ?

Lorsque j'ajoute ce champ à la liste des champs comme ceci :

class Meta:
    model = Account
    fields = ('myfield1', 'myfield2', 'customField')

alors je reçois une erreur parce que customField ne fait pas partie de mon modèle - ce qui est correct car je veux l'ajouter juste pour ce sérialiseur.

Y a-t-il un moyen d'ajouter un champ personnalisé ?

13voto

François Points 1177

Pour montrer self.author.full_name j'ai eu une erreur avec Field . Il a travaillé avec ReadOnlyField :

class CommentSerializer(serializers.HyperlinkedModelSerializer):
    author_name = ReadOnlyField(source="author.full_name")
    class Meta:
        model = Comment
        fields = ('url', 'content', 'author_name', 'author')

9voto

David Nathan Points 2616

Je cherchais une solution pour ajouter un champ personnalisé inscriptible à un sérialiseur de modèle. J'ai trouvé celle-ci, qui n'a pas été couverte dans les réponses à cette question.

Il semble que vous deviez effectivement écrire votre propre Serializer simple.

class PassThroughSerializer(serializers.Field):
    def to_representation(self, instance):
        # This function is for the direction: Instance -> Dict
        # If you only need this, use a ReadOnlyField, or SerializerField
        return None

    def to_internal_value(self, data):
        # This function is for the direction: Dict -> Instance
        # Here you can manipulate the data if you need to.
        return data

Vous pouvez maintenant utiliser ce Serializer pour ajouter des champs personnalisés à un ModelSerializer

class MyModelSerializer(serializers.ModelSerializer)
    my_custom_field = PassThroughSerializer()

    def create(self, validated_data):
        # now the key 'my_custom_field' is available in validated_data
        ...
        return instance

Cela fonctionne également si le modèle MyModel a en fait une propriété appelée my_custom_field mais vous voulez ignorer ses validateurs.

7voto

guillaumevincent Points 633

Avec la dernière version de Django Rest Framework, vous devez créer une méthode dans votre modèle avec le nom du champ que vous voulez ajouter.

class Foo(models.Model):
    . . .
    def foo(self):
        return 'stuff'
    . . .

class FooSerializer(ModelSerializer):
    foo = serializers.ReadOnlyField()

    class Meta:
        model = Foo
        fields = ('foo',)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X