如何让Django AutoFields以更高的数字开始
题
对于我们的Django应用程序,我们希望得到一个 AutoField
以1以外的数字开头。似乎没有一种明显的方法可以做到这一点。有什么想法吗?
解决方案
就像其他人所说的那样,这在数据库方面比Django方面要容易得多。
对于Postgres,它是是这样的: ALTER SEQUENCE sequence_name RESTART WITH 12345;
查看您自己的数据库引擎的文档,了解您在那里的工作方式。
其他提示
对于MySQL,我创建了一个在syncdb之后执行此操作的信号:
from django.db.models.signals import post_syncdb
from project.app import models as app_models
def auto_increment_start(sender, **kwargs):
from django.db import connection, transaction
cursor = connection.cursor()
cursor = cursor.execute("""
ALTER table app_table AUTO_INCREMENT=2000
""")
transaction.commit_unless_managed()
post_syncdb.connect(auto_increment_start, sender=app_models)
在syncdb之后执行alter table语句。这将免除你必须登录mysql并手动发出它。
编辑:我知道这是一个老线程,但我认为这可能有助于某人。这是我做的......
def update_auto_increment(value=5000, app_label="remrate_data"):
"""Update our increments"""
from django.db import connection, transaction, router
models = [m for m in get_models() if m._meta.app_label == app_label]
cursor = connection.cursor()
for model in models:
_router = settings.DATABASES[router.db_for_write(model)]['NAME']
alter_str = "ALTER table {}.{} AUTO_INCREMENT={}".format(
_router, model._meta.db_table, value)
cursor.execute(alter_str)
transaction.commit_unless_managed()
自动字段在某种程度上取决于正在使用的数据库驱动程序。
您必须查看为特定数据库实际创建的对象,以查看正在发生的事情。
快速浏览来源表明似乎没有任何选择,可能是因为它并不总是增加一个;它选择下一个可用密钥:“根据可用ID自动递增的IntegerField”。 — djangoproject.com
我需要做类似的事情。我避免了复杂的东西,只创建了两个字段:
id_no = models.AutoField(unique=True)
my_highvalue_id = models.IntegerField(null=True)
在views.py中,我只是在id_no中添加了一个固定的数字:
my_highvalue_id = id_no + 1200
我不确定它是否有助于解决您的问题,但我认为您可能会觉得这很容易解决。
不隶属于 StackOverflow