J'ai créé un ModelSerializer
et je souhaite ajouter un champ personnalisé qui ne fait pas partie de mon modèle.
J'ai trouvé une description pour ajouter des champs supplémentaires ici et j'ai essayé ce qui suit:
customField = CharField(source='my_field')
Lorsque j'ajoute ce champ et que j'appelle ma validate()
fonction, ce champ ne fait pas partie du attr
dict. attr
contient tous les champs de modèle spécifiés à l'exception des 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 j'obtiens une erreur car customField
ne fait pas partie de mon modèle - ce qui est correct parce que je veux l'ajouter juste pour ce sérialiseur.
Existe-t-il un moyen d'ajouter un champ personnalisé?
Réponses:
Vous faites la bonne chose, sauf que
CharField
(et les autres champs tapés) sont pour les champs inscriptibles.Dans ce cas, vous voulez juste un champ en lecture seule simple, alors utilisez simplement:
la source
.validate()
méthode pour supprimer l'attribut. Voir: django-rest-framework.org/api-guide/serializers.html#validation Cela ferait ce dont vous avez besoin, même si je ne comprends pas vraiment le cas d'utilisation, ou pourquoi vous voulez un champ inscriptible lié à un propriété en lecture seuleget_absolute_url
?get_absolute_url
je viens de le copier et coller à partir des documents. Je veux juste un champ inscriptible normal auquel je peux accéder dans le fichiervalidate()
. Je viens de deviner que j'aurais besoin de l'source
attribut ...En fait, il existe une solution sans toucher du tout au modèle. Vous pouvez utiliser
SerializerMethodField
ce qui vous permet de connecter n'importe quelle méthode à votre sérialiseur.la source
SerializerMethodField
n'est pas le cas... pour plus de clarté, si vous avez une méthode modèle définie de la manière suivante:
Vous pouvez ajouter le résultat de l'appel de ladite méthode à votre sérialiseur comme ceci:
ps Puisque le champ personnalisé n'est pas vraiment un champ dans votre modèle, vous voudrez généralement le rendre en lecture seule, comme ceci:
la source
perform_create(self, serializer)
,perform_update(self, serializer)
,perform_destroy(self, instance)
.voici la réponse à votre question. vous devez ajouter à votre compte modèle:
maintenant vous pouvez utiliser:
source: https://stackoverflow.com/a/18396622/3220916
la source
Pour montrer
self.author.full_name
, j'ai eu une erreur avecField
. Cela a fonctionné avecReadOnlyField
:la source
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 souhaitez ajouter.
la source
Je cherchais une solution pour ajouter un champ personnalisé inscriptible à un sérialiseur de modèle. J'ai trouvé celui-ci, qui n'a pas été couvert dans les réponses à cette question.
Il semble que vous ayez effectivement besoin d'écrire votre propre sérialiseur simple.
Vous pouvez maintenant utiliser ce sérialiseur pour ajouter des champs personnalisés à un ModelSerializer
Cela fonctionne également si le modèle a
MyModel
en fait une propriété appeléemy_custom_field
mais que vous souhaitez ignorer ses validateurs.la source
Après avoir lu toutes les réponses ici, ma conclusion est qu'il est impossible de faire cela proprement. Vous devez jouer sale et faire quelque chose de hadk, comme créer un champ write_only, puis remplacer les méthodes
validate
etto_representation
. C'est ce qui a fonctionné pour moi:la source