(如何)我能否声明Django REST框架如何对字段类型进行反序列化?

时间:2018-11-20 17:37:08

标签: django-rest-framework

我在基于django.db.models.IntegerField的Django项目中使用了自定义字段类型,并且该类型用于模型中的各个字段。它用于将数据作为整数存储在数据库中,同时具有更复杂的相关Python类型和字符串表示形式。它还实现了方法value_to_stringto_python,例如在使用./manage.py dumpdata时要遵守的方法。

我还公开了带有DRF的REST API,其中使用了基于rest_framework.serializers.HyperlinkedModelSerializer的非常通用的序列化程序,并且在fields对象中将__all__配置为Meta

访问该API时,尝试通过TypeError来处理上述Python类型时,会在rest_framework.fields.IntegerField.to_representation中抛出int

现在,考虑到已针对该类型实现了反序列化例程,可以很容易地实现字段类型(在DRF中,是前面提到的类的替代)。但是,如何在该字段 type 与Django ORM的映射之间设置一次映射,而又不为每个受影响的字段声明(DRF)字段类型?我在serializer fields docsrest_framework.fields模块中都找不到任何提示。

1 个答案:

答案 0 :(得分:1)

您需要创建一个与您的模型字段相对应的自定义序列化器字段,然后将其添加到DRF用于ModelSerializers的映射中。

这也是DRF如何添加django.contrib.postgres.fields.*映射的方式。

类似这样的东西:

class MyField(models.IntegerField):
    pass

class MyDrfField(Field):
    def to_internal_value(...)
    def to_representation(...)

ModelSerializer.serializer_field_mapping[MyField] = MyDrfField