在Django Rest Framework中,我有一个序列化器。我收到一些数据,其中一个名为categories
的数据是一个字符串数组:
{
"name": "John",
"age": 25,
"categories": ["ADC", "HJD", "RTP"]
}
我想将数组序列化为逗号分隔的字符串("ADC,HJD,RTP"
),以便可以将其放入CharField
。
因此,我在序列化器中创建了一个validate_categories()
方法,如下所示:
class DeviceSerializer(HALSerializer):
# here some other stuff
categories = serializers.SerializerMethodField()
class Meta:
model = Device
fields = (
'_links',
'id',
'name',
'age',
'categories',
)
def get_categories(self, obj):
if obj.categories is None:
return []
return [
obj.categories.choices[key.upper()]
for key in obj.categories
]
def validate_categories(self, categories):
print("IN THE VALIDATOR") # WE NEVER REACH THIS POINT
print(categories)
return categories
def create(self, validated_data):
# here some custom creation code
device = Device.objects.create(**validated_data)
return device
当我发布JSON时,对象已创建,但从未调用验证器。
有人知道我在做什么错吗?
答案 0 :(得分:0)
serializers.SerializerMethodField()
是只读字段,因此不会用于反序列化。
您可以添加一个新的write_only
字段,该字段仅用于反序列化,例如categories_list
:
class DeviceSerializer(HALSerializer):
categories = serializers.SerializerMethodField()
categories_list = serializers.ListField(child=serializers.CharField(), write_only=True)
如果您无法控制输入,请切换字段名称。并将categories_list
添加到DeviceSerializer.Meta.fields
并相应地更改反序列化字段的validate_
方法名称。