django动态建立model,实现分表
·
今天拿到一个需求,数据有很多,我们需要把数据分表存;于是去找了大量的django分表资料.并且实现了,以留下一个记录
models.py
from django.db import models
from django.db import connection
class Book(models.Model):
code = models.CharField(max_length=18, verbose_name="编码")
name = models.CharField(max_length=18, verbose_name="名称")
class Meta:
db_table = 'book'
verbose_name = '书籍表'
verbose_name_plural = verbose_name
abstract = True
@classmethod
def get_table_name(cls, id):
# 修改表后缀
return f'{table_prefix}model_{id}'
@classmethod
def is_exists(cls, id):
# 判断model是否存在
table_name = cls.get_table_name(id)
return table_name in connection.introspection.table_names()
@classmethod
def sharding_get(cls, id):
# 获取model实例
new_cls = cls.get_table_model(id)
return new_cls
_table_model = {}
@classmethod
def get_table_model(cls, id: str):
"""
创建模型
:param no:
:return:
"""
# 要连接的数据表,
table_name = cls.get_table_name(id)
if table_name in cls._table_model:
return cls._table_model[table_name]
# 这里会重新设置创建的model的名字,每个model名字都是动态的,不是BaseTable
class Metaclass(models.base.ModelBase):
def __new__(cls, name, bases, attrs):
name += id # 这是Model的name.
return models.base.ModelBase.__new__(cls, name, bases, attrs)
# 注意继承的顺序
class BaseTable(Book, metaclass=Metaclass):
class Meta:
abstract = False
# proxy = True # 核心即 proxy + _meta.db_table
db_table = table_name
BaseTable._meta.db_table = table_name
cls._table_model[table_name] = BaseTable
return BaseTable
@classmethod
def create_model(cls, id):
# 创建model实例
table_name = cls.get_table_name(id)
cls._meta.db_table = table_name
if not table_name in connection.introspection.table_names():
with connection.schema_editor() as schema_editor:
schema_editor.create_model(cls)
使用方式
# 创建表
Book.create_model(2)
# 使用表
book = Book.sharding_get(2)
# 查询
book.objects.all()
# 新增
book.objects.create()
# 修改
book.objects.filter(id=1).update(name="A")
# 删除
book.objects.filter(id=1).delete(name="A")
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)