2017-09-23 5 views
1

Je veux créer un nouvel enregistrement dans la base de données, je définir un modèle comme ci-dessous:Comment personnaliser les champs dans le cadre de repos django sérialiseur

class FooModel(models.Model) 
    subject_key= models.CharField(max_length=2) 
    subject= modeels.CharField(max_length=100) 

Ce que je veux faire est de ce champ « subject_key » devrait être donné par le client, et en utilisant la touche subject_key, le serveur trouvera la valeur 'subject' et la mettra dans la base de données. J'ai donc essayé d'utiliser ModelSerializer pour créer un nouvel enregistrement.

class FooSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = FooModel 

    def get_subject(self, obj): 
     if obj.subject == 'SO': 
      return 'Stack Overflow' 
     else: 
      return 'Nothing in here' 

et code principal de course vue de l'intérieur reste api est:

class FooView(APIView): 
    def post(self, request, *args, **kwargs): 
     serializer = FooSerializer(data=request.data) 
     if serializer.is_valid(raise_exception=True) 
      serializer.save() 
      foo = serializer.data 

Je l'ai vérifié créer avec succès un nouvel enregistrement dans la base de données, mais le nouveau record a NULL à la colonne 'sujet'

Que dois-je faire pour définir dynamiquement la valeur du champ dans le sérialiseur?

+0

comment vous obtenez la valeur sous réserve d'un utilisateur de demande ou vous transmettre demandez paramètre – Robert

+0

@Robert peut-être que je vous ai fait un peu confus tout en raccourcissant mon code. Je l'ai édité à nouveau, et je reçois subject_value de request.data quand l'utilisateur demande POST – Kari

+0

après l'obtention de subject_vaule vous devez assigner cette valeur à subject_key droite ?? – Robert

Répondre

0

vous déclarez votre champ sujet sérialiseur comme champ de méthode, il toujours en lecture seule (serializermethodfield), vous pouvez renommer votre déposé par exemple:

class FooSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = FooModel 

    def get_var_subject(self, obj): 

de cette façon, vous aurez des champs d'arbres dans votre seriaizer 'subject', 'subject_key', 'var_subject'

OU vous pouvez ajouter votre mehod au modèle et utiliser to_representation

def to_representation(self, instance): 
    representation = super(FooSerializer, self).to_representation(instance) 
    representation['subject'] = instance.get_subject() 
    return representation 

ou l'utilisation f ield to_representation exemple connexe déposé, mais j'espère que vous pouvez l'utiliser

OU vous devez remplacer save méthode

0

vous pouvez essayer cette

def post(self, request, *args, **kwargs): 
     request.data['subject_key'] = request.data['subject'] 
     serializer = FooSerializer(data=request.data) 
     if serializer.is_valid(raise_exception=True) 
      serializer.save() 
      foo = serializer.data