我有一些包含非字母数字字符的JSON键,例如 "my-key="
我需要将此键映射到我的 Django 模型中的字段my_key
。
执行此操作的传统方法是将自定义字段添加到指定source
的ModelSerializer
:
class MyModelSerializer(serializers.ModelSerializer):
my_key= = serializers.CharField(source='my_key')
class Meta:
model = MyModel
fields = ('my-key=',)
但是,这显然不起作用,因为:
my_key= = serializers.CharField(source='my_key')
不是用于声明属性的有效 python。
如何将我的 JSON 密钥映射到模型字段?
我将使用 DRF 提供的这两种序列化程序方法:
.to_representation()
- 重写此选项以支持读取操作的序列化。进行从django_legit_name
到django-not-legit-field-name
的映射
.to_internal_value()
- 重写此选项以支持反序列化,用于写入操作。进行从django-not-legit-field-name
到django_legit_name
的映射
您可以在此处找到示例:http://www.django-rest-framework.org/topics/3.0-announcement/#serializers
只需为序列化程序创建自定义元类:
class CustomMetaClass(serializers.SerializerMetaclass):
def __new__(cls, name, bases, attrs):
custom_fields_mapping = attrs.get('custom_fields_mapping')
if custom_fields_mapping:
for label, value in custom_fields_mapping.items():
if attrs.get(label):
attrs[value] = attrs.pop(label)
return super().__new__(cls, name, bases, attrs)
并像这样使用它:
class MySerializer(serializers.Serializer, metaclass=CustomMetaClass):
custom_fields_mapping = {"my_field": "$_my_field"}
my_field = serializers.CharField()
它将生成以下序列化程序:
In [2]: MySerializer()
Out[2]:
MySerializer():
$_my_field = CharField()