如何在 Django Rest Framework Serializer 中映射具有非字母数字字符的 JSON 键



我有一些包含非字母数字字符的JSON键,例如 "my-key="

我需要将此键映射到我的 Django 模型中的字段my_key

执行此操作的传统方法是将自定义字段添加到指定sourceModelSerializer

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_namedjango-not-legit-field-name的映射

.to_internal_value() - 重写此选项以支持反序列化,用于写入操作。进行从django-not-legit-field-namedjango_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()

最新更新