Je souhaite sérialiser un modèle, mais je souhaite inclure un champ supplémentaire qui nécessite d'effectuer des recherches dans la base de données sur l'instance de modèle à sérialiser:
class FooSerializer(serializers.ModelSerializer):
my_field = ... # result of some database queries on the input Foo object
class Meta:
model = Foo
fields = ('id', 'name', 'myfield')
Quel est le bon moyen de le faire? Je vois que vous pouvez passer en "contexte" supplémentaire au sérialiseur, est-ce que la bonne réponse est à passer dans le champ supplémentaire dans un dictionnaire de contexte? Avec cette approche, la logique d'obtention du champ dont j'ai besoin ne serait pas autonome avec la définition du sérialiseur, ce qui est idéal puisque chaque instance sérialisée en aura besoin my_field
. Ailleurs dans la documentation des sérialiseurs DRF, il est dit que "des champs supplémentaires peuvent correspondre à n'importe quelle propriété ou être appelés sur le modèle". Est-ce que je parle de champs supplémentaires? Dois-je définir une fonction dans Foo
la définition de modèle de qui renvoie une my_field
valeur, et dans le sérialiseur, je connecte my_field à cet appelable? A quoi cela ressemble-t-il?
Merci d'avance, heureux de clarifier la question si nécessaire.
field_name = serializers.SerializerMethodField()
etdef get_field_name(self, obj):
foo
quand def un SerializerMethodField? lorsque vous utilisez CreateAPIView, le toto a-t-il été stocké puis peut-il utiliser la méthode is_named_bar ()?Vous pouvez changer votre méthode de modèle en propriété et l'utiliser dans le sérialiseur avec cette approche.
Edit: Avec les versions récentes du cadre de repos (j'ai essayé 3.3.3), vous n'avez pas besoin de changer de propriété. La méthode du modèle fonctionnera très bien.
la source
variable = model_instance.my_field
donne le même résultat quevariable = model_instance.my_field()
sans le décorateur. aussi: stackoverflow.com/a/6618176/2198571source='my_field'
n'est plus nécessaire et soulève une exceptionAvec 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. Pas besoin
@property
etsource='field'
signaler une erreur.la source
request
objet à l'intérieur de def foo (self) qui pourrait modifier la valeur de foo? (exemple une recherche basée sur request.user)Ma réponse à une question similaire ( ici ) pourrait être utile.
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
si vous voulez lire et écrire sur votre champ supplémentaire, vous pouvez utiliser un nouveau sérialiseur personnalisé, qui étend les sérialiseurs.Serializer, et l'utiliser comme ceci
J'utilise ceci dans les champs imbriqués associés avec une logique personnalisée
la source
Cela a fonctionné pour moi . Si nous voulons simplement ajouter un champ supplémentaire
ModelSerializer
, nous pouvons le faire comme ci-dessous, et le champ peut également se voir attribuer une valeur après quelques calculs de recherche. Ou dans certains cas, si nous voulons envoyer les paramètres dans la réponse API.Dans model.py
Dans serializer.py
J'espère que cela pourrait aider quelqu'un.
la source
Comme l'a dit le programmeur chimique dans ce commentaire , dans le dernier DRF, vous pouvez le faire comme ceci:
Source de la documentation DRF
la source