前言
正式开始上班了。工作中遇到个问题,就是在Django
中要根据应用名进行动态分表。实现时遇到点问题,在这里记录下整体的思路和实现。
具体任务
利用Django
的ORM
机制根据应用名实现动态分表。简单来说就是保持Model
结构不变的情况下,可以在服务器运行时,动态在应用名对应的表内进行数据库操作。每个应用独立出一张表。所有表的结果相同。
思路
Django
中的每个Model
对应数据库中的一张表。每个Model
也就是一个继承自django.models.Model
的Python
类。每个类正常是包含三个部分:
- 类属性。每个类属性对应表中的一个字段。
- Meta嵌套类。Meta嵌套类中也包含了一些类属性。常见的有 db_table 和 app_label。db_table定义了这个Python类对应的表名。app_label则定义了这个Python类对应的应用名。
- 类方法/实例方法。这些方法不是必须有的。可以根据需要进行编写。
如上所言,类属性定义了表的结构。而Meta嵌套类则决定了表名。
因此如果能够在代码中根据应用名动态切换Meta
嵌套类的类属性,也就实现了根据应用名动态分表的功能。
实际实现时,就是定义一个类方法,根据应用名,设定Meta
嵌套类具体类属性,然后使用type
基于原有的Python
类的类属性和新的Meta
嵌套类创建一个新类。使用新类基于ORM