代码之家  ›  专栏  ›  技术社区  ›  funky-future euri10

(how)我可以声明一个字段类型如何被django-rest框架反/序列化吗?

  •  0
  • funky-future euri10  · 技术社区  · 6 年前

    我在Django项目中使用的自定义字段类型基于 django.db.models.IntegerField 并且该类型用于模型中的各个字段。它用于将数据以整数形式存储在数据库中,同时具有更复杂的相关python类型和字符串表示形式。它还实现了这些方法 value_to_string to_python 在使用时受到尊重 ./manage.py dumpdata 例如。

    我还公开了一个带有DRF的RESTAPI,其中一个非常通用的序列化程序基于 rest_framework.serializers.HyperlinkedModelSerializer 具有 fields 配置为 __all__ 在其 Meta 使用对象。

    当访问该API A时 TypeError 被扔进 rest_framework.fields.IntegerField.to_representation 当它试图通过 int .

    现在,考虑到针对所讨论的类型实现了一些反/序列化例程,很容易实现字段类型(在DRF中,这意味着可以替换前面提到的类)。但是如何在这个字段之间建立映射 类型 Django ORM只有一次,没有为每个受影响的字段声明(drf)字段类型?我在 serializer fields docs 也不在 rest_framework.fields 模块。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Andrew    6 年前

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

    这就是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