教程代码托管在JackeyGao / django-dynamic-tables
用过 Django 框架的都知道, 模型定义是开发一个项目前面需要做的事情, 后面通过导入的方式在 View 中操作。 这样的流程是 Django 默认的流程, 但流程是一成不变的吗? 大多数时候, 我们的设计的系统, Django 默认的框架都不能适用, Django 的确封装了很多功能组件,让MVT架构更有效率的开发, 您在设计的时候必须按照它们设计好的框架里面设计程序。 但今天要讲是一种比较干燥的方式
假设我有一个需求是一个日志表(log),需要动态的根据每天生成结果表(log_20181211, log_20181212)。
默认情况下, 我们需要定义Model
models.py
然后通过 migrate 创建表, 这样的代码很属于 Django 风格,但实现不了我们的需求。 默认的 Django ORM 操作没有根据时间切割表. migrate 之后这张表就已经永久创建了。 后面操作这个 Model 一直在操作 log 这张表.
动态的创建表
动态的创建模型其实就是在运行时生成 Model 类, 这个可以通过函数实现, 通过传参(今天的日期, 如: 20181211),然后生成新的模型类, Meta 中的 db_table 为log_20181211.
可以看到, 通过函数生成不同的 Log Class. 注意LogMetaclass和__metaclass__ , 元类可以在运行时改变模型的名字,table 的名称我们可以通过db_table定义, 类的名称可以通过覆盖元类的方法定义。
使用
使用直接通过函数, 获取当前日期的 Log 模型, 然后通过is_exists判读表是否创建, 没有创建则创建对应的表.
上面获取 cls 部分, 这里的代码先通过apps的已经注册的 all_models 获取, 否则一个模型的第二次执行定义代码就会抛出RuntimeWarning警告, 在模型的初始化函数都会注册此模型, 最好不要重复注册. 先通过apps.get_model获取这个模型, 如果没有获取到则通过get_log_model初始化新的模型. 这样做更加稳妥一点.
代码托管在JackeyGao / django-dynamic-tables
领取专属 10元无门槛券
私享最新 技术干货