我的模特:
class User(models.Model) :
"""Model for a Person"""
email = models.EmailField(unique=True)
groups = models.IntegerField(default=0)
name = models.CharField(max_length=254, blank=True, null=True)
phone = models.CharField(max_length=10, blank=True, null=True)
sex = models.CharField(max_length=7, blank=True, null=True)
此类已有id主键。我的数据库中有以下条目:
In [23]: temp = User.objects.all()
In [24]: temp
Out[24]: [<User: testid@test.com>, <User: test2@test.com>]
In [25]: temp[0].id
Out[25]: 15
In [26]: temp[1].id
Out[26]: 16
现在我跑的时候:
python manage.py flush
以下是我的数据库的外观:
In [27]: User.objects.all()
Out[27]: []
现在,当我添加一个新用户时,它在 16 之后的ID与之前的输出相同。
In [28]: x = User(email="test3@faf.com")
In [29]: x.save()
In [30]: x.id
Out[30]: 17
我已经阅读了答案Stack Overflow answer,主键在他们离开后继续。我也很好,不想改变这种行为。相反,我想要的是创建另一个字段,在刷新数据库之后再从1开始。我有一些依赖于这种行为的逻辑。请告诉我一个方法,以便我可以创建一个Integer Type自动增量字段,在刷新时重置为1。
我使用sqlite3作为数据库。
答案 0 :(得分:1)
您可以在manage.py dbshell
delete from your_table;
delete from sqlite_sequence where name='your_table';
这将重置自动增量,您可以轻松地将其转换为命令。 here是关于它的更多信息。
这看起来像这样
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument('table_name',type=str)
def handle(self, *args, **options):
table_name = options['table_name']
cursor = connection.cursor()
cursor.execute("delete from {}".format(table_name))
cursor.execute("delete from from sqlite_sequence where name='{}'".format(table_name))
另请注意,表格名称为app_name
+ _
+ model_name
。
所以对于例如。如果你有一个名为work
的应用程序和一个名为employee
的模型,那么sqlite中的默认表名将为work_employee
。
注意:我没有测试过代码。