less than 1 minute read

MYSQL

MySQL中,可以通过指定auto_increment来设置自增的起始值

CREATE TABLE TEST(
id int not null auto_increment primary key,
name varchar(127) not null default 'ISM'
)auto_increment=10000;

Django中,可以使用Signals来设置主键从特定值开始自增。

首先是准备工作,创建一个model

class ISMModel(models.Model):
    name = models.CharField()

这个model将会创建一个默认的id字段作为主键,但是它的自增是从1开始的。所以我们可以在初始化时插入一条id=9999的数据然后删除,这样后续插入的数据就会从id=10000开始。

假设一个django项目结构:

project
    - project
        - settings.py
    - app1
        - __init__.py
        - models.py
        - apps.py
        ...

apps.py中加入以下代码

# apps.py

from django.apps import AppConfig
from django.db.models.signals import post_migrate


# 定义一个回调函数,在该函数中创建一条初始化数据然后删除
# 该函数必须接收一个sender参数
def increment_callback(sender, **kwargs):
    from app1.models import TestModel

    if sender.name == 'app1':
        try:
            test_model = TestModel.objects.create(id=9999, ...)
            test_model.delete()
        except:
            pass

class App1Config(AppConfig):
    name = 'app1'

    def ready(self):
        # 注册改回调函数
        post_migrate.connect(increment_callback, sender=self)

以上,我们使用了post_migrate来注册回调,表示当migrate执行后,发送该信号。

注意。导入模型类不能写到函数之外,因为此时app1尚未注册,会抛出注册错误 django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

还有很多其他的信号可选,如pre_migrate,表示在migrate执行之前发送该信号。详细的信号可参考官方文档 Signals

settings.pyINSTALL_APPS中加入app1

# settings.py

...
INSTALL_APPS = [
    ...
    'app1.apps.App1Config'
]

注意,这里不能单纯的写作app1,因为我们的目的在于导入该app时触发信号。

以上,当执行migrate后,插入的数据ID将从10000开始递增。