我在基于django.db.models.IntegerField
的Django项目中使用了自定义字段类型,并且该类型用于模型中的各个字段。它用于将数据作为整数存储在数据库中,同时具有更复杂的相关Python类型和字符串表示形式。它还实现了方法value_to_string
和to_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 docs或rest_framework.fields
模块中都找不到任何提示。
答案 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