2017-10-19 15 views
0

Après avoir créé un objet Django dans un CreateAPI de DRF, vous obtenez un statut 201 créé et l'objet est retourné avec le même sérialiseur que vous avez utilisé pour créer l'objet Django.Comment avoir différents sérialiseurs pour read_only et write_only avec le même nom dans DRF?

Recherché: sur créer: Serializer.comments = Textfield (write_only = True) et créé (201 état) Serializer.comments = une liste de commments

Je sais qu'il est possible par remplaçant la fonction CreateAPIView.create. Cependant, j'aimerais savoir si c'est possible en utilisant les attributs write_only=True et read_only=True pour les champs du sérialiseur. Pour l'instant, je pense que ce n'est pas possible parce qu'ils ont tous deux le même nom. je l'aurais aimé faire quelque chose comme cela en utilisant un nom de kwarg faux actual_name:

class CreateEventSerializer(serializers.ModelSerializer): 
    comments_readonly = serializers.SerializerMethodField(read_only=True, actual_name='comments') 

class Meta: 
    model = Event 
    fields = ('id', 'comments', 'comments_readonly') 

def __init__(self, *args, **kwargs): 
    super(CreateEventSerializer, self).__init__(*args, **kwargs) 
    self.fields['comments'].write_only = True 

def get_comments_readonly(self, obj): 
    comments = obj.comments.replace('\r', '\n') 
    return [x for x in comments.split('\n') if x != ''] 

Mais cette façon, le JSON qui est retourné contient toujours la clé « comments_readonly » au lieu des clés « commentaires » voulu.

En utilisant le dernier DRF, 3.7.1

En d'autres termes: Est-il possible de créer un champ de sérialiseur qui se comporte différemment selon lecture et d'écriture, (en utilisant seulement 1 classe sérialiseur)?

Répondre

0

Cela semble faire l'affaire pour la réponse JSON, mais il se sent un peu hacky, comme les formulaires HTML DRF affiche maintenant une liste python dans le champ textarea commentaires.

class CreateEventSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Event 
     fields = ('id', 'comments') 

    def get_comments(self, obj): 
     comments = obj.comments.replace('\r', '\n') 
     return [x for x in comments.split('\n') if x != ''] 

    def to_representation(self, instance): 
     data = super(CreateEventSerializer, self).to_representation(instance) 
     data['comments'] = self.get_comments(instance) 
     return data