在Django模型中,如何在flush上创建一个重置为1的字段?

时间:2016-04-07 06:56:23

标签: python django sqlite

我的模特:

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作为数据库。

1 个答案:

答案 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

注意:我没有测试过代码。