运行时类型系统:让Django模型支持动态字段增删而不迁移
实现一个DynamicModel,允许在运行时增加/删除字段,数据以JSONB存储但通过Descriptor伪装成普通字段,且支持索引。 · 难度:入门 · +10XP
运行时类型系统:让Django模型支持动态字段增删而不迁移
对于SaaS多租户场景,每个租户可能需要不同字段。本教程将创建一个DynamicModel基类:所有动态字段存储在meta字段(JSONB)中,但通过Python描述符(Descriptor)暴露出具体的属性访问。支持为动态字段添加PostgreSQL GIN索引加速查询。提供FieldRegistry全局注册表,管理字段类型和校验器。
class DynamicFieldDescriptor:
def __init__(self, field_name, field_type):
self.field_name = field_name
self.field_type = field_type
def __get__(self, instance, owner):
return instance.meta.get(self.field_name)
def __set__(self, instance, value):
validated = self.field_type(value) # 类型转换
instance.meta[self.field_name] = validated