我的模特:

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

注意:我尚未测试代码。

09-25 18:46
查看更多