Django Repos Cadre - Comment ajouter un champ personnalisé dans ModelSerializer
J'ai créé un ModelSerializer
et souhaitez 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é le suivant:
customField = CharField(source='my_field')
Quand j'ajoute ce domaine, et d'appeler mon validate()
fonction de ce champ ne fait pas partie de la attr
dict. attr
contient tous les champs de modèle spécifié, sauf les champs supplémentaires. Je ne peux donc pas accéder à ce champ dans mon écrasé de validation, puis-je?
Quand j'ai ajouter ce champ dans la liste de champs comme ceci:
class Meta:
model = Account
fields = ('myfield1', 'myfield2', 'customField')
puis-je obtenir une erreur car customField
ne fait pas partie de mon modèle - ce qui est correct parce que je veux ajouter juste pour cette sérialiseur.
Est-il possible d'ajouter un champ personnalisé?
- Pourriez-vous développer "Mais quand mon champ n'est pas dans le champ modèle de la liste spécifiée dans le sérialiseur il ne fait pas partie de la valider() attr-dictionnaire.", Je ne suis pas sûr que ce soit très clair.
- Aussi, "il se plaint, à juste titre, que je n'ai pas de champ personnalisé dans mon modèle.", pourriez-vous expliciter l'exception de votre voir - merci! 🙂
- J'ai mis à jour mon post et j'espère que c'est plus clair maintenant. Je veux juste savoir comment je peux ajouter un champ qui n'est pas partie de mon modèle...
- Comment étendre le modèle sur sérialiseur niveau avec django-repos-cadre
- Double Possible de Django RESTE du Cadre: ajout de champs supplémentaires pour ModelSerializer
Vous devez vous connecter pour publier un commentaire.
Vous êtes en train de faire la bonne chose, sauf que
CharField
(et les autres tapé champs) sont pour l'écriture des champs.Dans ce cas, vous voulez simplement un champ en lecture seule, donc au lieu simplement utiliser:
.validate()
méthode pour supprimer l'attribut. Voir: django-rest-framework.org/api-guide/serializers.html#validation Que feriez ce que vous avez besoin, même si je ne comprends pas vraiment le cas d'utilisation, ou pourquoi vous voulez un écriture champ qui est lié à un lecture seule propriétéget_absolute_url
?get_absolute_url
j'ai juste copier&coller avais de la documentation. Je veux juste normal de domaine accessible en écriture à laquelle je peux accéder à lavalidate()
. J'ai juste deviné que j'avais besoin de lasource
attribut...customField
n'est pas dans lefields()
tableau, mais est toujours accessible dans levalidate()
fonction?ReadOnlyField
au lieu deField
En fait-il une solution sans toucher à tous les modèle. Vous pouvez utiliser
SerializerMethodField
qui vous permettent de brancher n'importe quelle méthode pour votre sérialiseur.SerializerMethodField
s ne sont pas...pour plus de clarté, si vous avez un Modèle de Méthode définie de la manière suivante:
Vous pouvez ajouter le résultat de l'appel dit de la méthode de votre sérialiseur comme suit:
p.s. Depuis le champ personnalisé n'est pas vraiment un domaine dans votre modèle, vous aurez habituellement à se rendre en lecture seule, comme suit:
perform_create(self, serializer)
,perform_update(self, serializer)
,perform_destroy(self, instance)
.ici la réponse à votre question.
vous devriez ajouter à votre Compte modèle:
maintenant, vous pouvez utiliser:
source: https://stackoverflow.com/a/18396622/3220916
Pour montrer
self.author.full_name
, j'ai eu une erreur avecField
. Il a travaillé avecReadOnlyField
: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.
Je cherchais une solution pour l'ajout d'une écriture champ personnalisé à un modèle sérialiseur. J'ai trouvé celui-ci, qui n'a pas été abordés dans les réponses à cette question.
Il semble que vous n'avez en effet besoin d'écrire votre propre simple Sérialiseur.
Maintenant, vous pouvez utiliser ce Processus pour ajouter des champs personnalisés à un ModelSerializer
Cela fonctionne aussi, si le Modèle
MyModel
a en fait une propriété appeléemy_custom_field
mais vous voulez ignorer ses validateurs.