更改模型序列化程序中的字段类型而不更改模型

时间:2018-01-08 21:28:17

标签: python django django-rest-framework

我有一个带有字符串字段的模型,其中包含相应的模型序列化程序。我想更改序列化程序,以便它现在获取该字段的字符串列表,但在内部将该列表转换为字符串。

基本上,internal_repr = ','.join(input)

我已经尝试在validate函数中更改数据类型,但我仍然得到一个验证错误,它不是一个字符串。这种变化应该发生在哪里?是否还需要将该字段上的序列化程序覆盖为指定了ListSerializer的{​​{1}}?

当前情况的基本表示:

型号:

child=CharField

串行:

class MyModel(models.Model):
    myfield = models.CharField(max_length=100)

    def save(self, *args, **kwargs):
        self.full_clean()
        return super(MyModel, self).save(*args, **kwargs)

我想让序列化器为myfield取一个列表,并通过','将其转换为字符串.join()

1 个答案:

答案 0 :(得分:1)

我能够添加 myfield = serializers.ListField(child=serializers.CharField(), min_length=1) 序列化程序更改序列化程序类型,以及覆盖to_internal_value()to_representation()方法来实现此目的。

代码现在是:

型号:

class MyModel(models.Model):
    myfield = models.CharField(max_length=100)

    def save(self, *args, **kwargs):
        self.full_clean()
        return super(MyModel, self).save(*args, **kwargs)

串行:

MyModelSerializer(serializers.ModelSerializer):
   myfield = serializers.ListField(child=serializers.CharField(), min_length=1)

   def to_internal_value(self, data):
        myfield_val = data.get('myfield')
        output = super(MyModelSerializer, self).to_internal_value(data)
        output['myfield'] = ','.join(myfield_val)

   def to_representation(self, instance):
        myfield_val = instance.myfield.split(',')
        output = super(MyModelSerializer, self).to_representation(instance)
        output['myfield'] = myfield_val

   class Meta:
         model = MyModel
         fields = ('myfield')