2016-04-07 15 views
1

私のモデル:Djangoモデルでは、どのようにしてflushで1にリセットされるフィールドを作成できますか?

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: [email protected]>, <User: [email protected]>] 

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。

In [28]: x = User(email="[email protected]") 

In [29]: x.save() 

In [30]: x.id 
Out[30]: 17 

私は、主キーは、彼らが残したところ後も継続することを、答えStack Overflow answerを読みました。私もそれでうまくいくので、この振る舞いを変えたくありません。代わりに、私が望むのは、dbがフラッシュされた後に再び1から始まる別のフィールドを作成することです。私はこの動作に依存するいくつかのロジックを持っています。フラッシュ時に1にリセットされる整数型の自動インクリメントフィールドを作成できるように教えてください。

私はデータベースとしてsqlite3を使用しています。あなたはmanage.py dbshell

delete from your_table;  
delete from sqlite_sequence where name='your_table'; 

でこのコマンドを実行することができます

答えて

1

これは、自動インクリメントがリセットされます、そして、あなたは簡単にコマンドにこれを変換することができます。 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になります。

注:私はコードをテストしなかった。

関連する問題