如何让Django AutoFields以更高的数字开始

时间:2008-09-22 21:37:01

标签: python django autofield

对于我们的Django应用程序,我们希望得到AutoField以1以外的数字开头。似乎没有明显的方法可以做到这一点。有什么想法吗?

8 个答案:

答案 0 :(得分:18)

就像其他人所说的那样,这在数据库方面比Django方面要容易得多。

对于Postgres,它是like soALTER SEQUENCE sequence_name RESTART WITH 12345;请查看您自己的数据库引擎的文档,了解您是如何在那里完成的。

答案 1 :(得分:8)

对于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并手动发出它。

编辑:我知道这是一个老线程,但我认为这可能有助于某人。

答案 2 :(得分:2)

这是我做的......

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()

答案 3 :(得分:1)

快速查看source表明似乎没有任何选择,可能是因为它并不总是增加一个;它选择下一个可用密钥:“一个IntegerField根据可用ID自动递增” - djangoproject.com

答案 4 :(得分:1)

自动字段在某种程度上取决于正在使用的数据库驱动程序。

您必须查看为特定数据库实际创建的对象,以查看正在发生的事情。

答案 5 :(得分:0)

我需要做类似的事情。我避免了复杂的东西,只创建了两个字段:

id_no = models.AutoField(unique=True)
my_highvalue_id = models.IntegerField(null=True)

在views.py中,我只是在id_no中添加了一个固定的数字:

my_highvalue_id = id_no + 1200

我不确定它是否有助于解决您的问题,但我认为您可能会觉得这很容易解决。

答案 6 :(得分:0)

我找到了一个非常简单的解决方案! AutoField使用上一个值来确定分配的下一个值。因此,我发现,如果我插入了一个虚拟值,并使用所需的起始AutoField值,则后续插入将从该值开始递增。

一个简单的示例,分几个步骤:

1。) models.py

class Product(models.Model):
    id = model.AutoField(primaryKey=True) # this is a dummy PK for now
    productID = models.IntegerField(default=0)
    productName = models.TextField()
    price = models.DecimalField(max_digits=6, decimal_places=2)
  • makemigrations
  • 迁移

完成后,您将需要在初始行中插入“ productID”保存所需的AutoField起始值的值。您可以编写一个方法,也可以从Django Shell中执行。

从视图中看插入如下所示: views.py

from app.models import Product

dummy = {
   'productID': 100000,
   'productName': 'Item name',
   'price': 5.98,
}

Products.objects.create(**product)

插入后,您可以对模型进行以下更改:

models.py

class Product(models.Model):
    productID = models.AutoField(primary_key=True)
    productName = models.TextField()
    price = models.DecimalField(max_digits=6, decimal_places=2)

接下来的所有插入操作都将获得一个“ productID”,从100000 ... 100001 ... 100002 ...开始递增。

答案 7 :(得分:0)

在模型中你可以添加:

def save(self, *args, **kwargs):
       if not User.objects.count():
          self.id = 100
       else:
          self.id = User.objects.last().id + 1
       super(User, self).save(*args, **kwargs)

这仅在数据库当前为空(没有对象)时有效,因此第一个项目将被分配 id 100(如果不存在以前的对象)并且下一个插入将跟随最后一个 id + 1