我的Model主键如何以特定数字开头?

时间:2018-06-08 09:14:18

标签: python django

我有一个User模型,我希望它的id从10000开始,然后它的id应该自动增加,如:

10001100021000310004 ......

我的用户类:

class User(AbstractUser):
    username = models.CharField(max_length=64)
    ...

是否有可能实现它?

修改-1

在提出这个问题之前,我已经阅读了这个链接:Is there a way to set the id value of new Django objects to start at a certain value?

但我不认为答案是好的,所以我的意思是,如果在Django中有一个配置来实现这个目标吗?

4 个答案:

答案 0 :(得分:12)

方式与使用RAW_SQL进行datamigrations相同,更改你的APPNAME:

python manage.py makemigrations APPNAME --empty

在创建的文件中:

operations = [
    migrations.RunSQL('ALTER SEQUENCE APPNAME_USER_id_seq RESTART WITH 10000;')
]

答案 1 :(得分:1)

解决方案是设置自动增量字段,如:

user_id = models.AutoField(primary_key=True)

在此之后,您可以在数据库端运行此命令。您可以使用信号运行此python命令:

ALTER SEQUENCE user_id RESTART WITH 10000;

你可以通过不同的方法来做到这一点。

from django.db.models.signals import post_syncdb
from django.db import connection, transaction
cursor = connection.cursor()
cursor = cursor.execute(""" ALTER SEQUENCE user_id RESTART WITH 10000; """)
transaction.commit_unless_managed()

post_syncdb.connect(auto_increment_start, sender=app_models)

在Django中,模型不能有多个AutoField。这用于设置与默认密钥不同的主键。

答案 2 :(得分:0)

我的解决方案是手动完成:

$ ./manage.py shell
Python 3.6.5 (default, Apr  1 2018, 05:46:30)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from django.contrib.auth.models import User

In [2]: u = User.objects.create_user('name', '', '')

In [3]: User.objects.filter(id=u.id).update(id=10000-1)
Out[3]: 1

In [4]: u.delete()
Out[4]:
(0,
 {'admin.LogEntry': 0,
  'auth.User_groups': 0,
  'auth.User_user_permissions': 0,
  'auth.User': 0})

In [5]: uu = User.objects.create_user('user', '', '')

In [6]: uu.id
Out[6]: 10000

答案 3 :(得分: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)