我有一个带有字符串字段的模型,其中包含相应的模型序列化程序。我想更改序列化程序,以便它现在获取该字段的字符串列表,但在内部将该列表转换为字符串。
基本上,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()
答案 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')