我的模特:
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]: []
现在,当我添加一个新用户时,它的ID与之前的输出一样在16之后。
In [28]: x = User(email="test3@faf.com")
In [29]: x.save()
In [30]: x.id
Out[30]: 17
我已经阅读了答案Stack Overflow answer,主键在离开后继续。我对此也很满意,也不想改变这种行为。相反,我要创建的另一个内容是在刷新数据库后从1重新开始的字段。我有一些逻辑依赖于此行为。请告诉我一种方法,以便我可以创建一个整数类型自动递增字段,该字段在刷新时会重置为1。
我正在使用sqlite3作为数据库。
最佳答案
您可以在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
。注意:我尚未测试代码。