25

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

4

8 回答 8

20

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

对于 Postgres,它会是这样ALTER SEQUENCE sequence_name RESTART WITH 12345;查看您自己的数据库引擎的文档,了解您将如何在那里进行操作。

于 2008-09-23T00:25:54.977 回答
13

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

编辑:我知道这是一个旧线程,但我认为它可能会对某人有所帮助。

于 2011-06-17T15:48:47.737 回答
3

对源代码的快速浏览表明,似乎没有任何选择,可能是因为它并不总是加一;它选择下一个可用键:“根据可用 ID 自动递增的 IntegerField”—— djangoproject.com

于 2008-09-22T21:44:11.793 回答
3

这是我所做的..

def update_auto_increment(value=5000, app_label="xxx_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()
于 2013-03-09T23:58:13.813 回答
2

我找到了一个非常简单的解决方案!AutoField 使用先前的值来确定分配的下一个值是什么。所以我发现如果我插入了一个带有我想要的起始 AutoField 值的虚拟值,那么接下来的插入将从该值开始递增。

几个步骤的简单示例:

1.) 模型.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)
  • 移民
  • 迁移

完成后,您将需要插入初始行,其中“productID”包含您所需的 AutoField 起始值。您可以编写一个方法或从 django shell 执行此操作。

从视图来看,插入可能如下所示:views.py

from app.models import Product

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

Products.objects.create(**product)

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

模型.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...开始递增

于 2020-04-16T03:45:40.250 回答
1

自动字段在一定程度上取决于所使用的数据库驱动程序。

您必须查看为特定数据库实际创建的对象以了解发生了什么。

于 2008-09-23T00:03:35.873 回答
0

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

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

在views.py 中,我简单地在id_no 中添加了一个固定数字:

my_highvalue_id = id_no + 1200

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

于 2018-01-28T20:58:31.407 回答
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)

This works only if the DataBase is currently empty (no objects), so the first item will be assigned id 100 (if no previous objects exist) and next inserts will follow the last id + 1

于 2021-08-02T19:22:26.513 回答