2017-10-19 97 views
0

在DRF的CreateAPI中创建Django对象后,您将获得创建的状态201,并使用您用来创建Django对象的相同序列化程序返回该对象。如何在DRF中为具有相同名称的read_only和write_only使用不同的序列化程序?

通缉:创建:Serializer.comments =文本字段(WRITE_ONLY = TRUE) 和创建(201种状态)Serializer.comments =一个commments的列表

我知道这是可能的重写CreateAPIView.create函数。 但是,我想知道是否有可能通过使用write_only=Trueread_only=True属性到序列化程序字段。

现在我认为这是不可能的,因为它们都具有相同的名称。 我已经喜欢使用的是假名字kwarg到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 != ''] 

不过这样一来,返回的JSON仍然包含密钥“comments_readonly”,而不是想关键的“意见”。

采用了最新DRF,3.7.1

换句话说: 是否有可能创建一个有不同的特征上读串行场和写入,(只使用1个串行类)?

回答

0

这似乎是做了JSON响应的伎俩,但它感觉有点不好意思,因为DRF HTML表单现在在comments textarea字段中显示了一个python列表。

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 
相关问题