Django AutoFields をより高い番号で開始する方法
質問
Django アプリの場合、 AutoField
1 以外の数字から始めること。これを行う明確な方法はないようです。何か案は?
解決
他の人が言ったように、これは Django 側よりもデータベース側で行う方がはるかに簡単です。
Postgres の場合は次のようになります。 そのようです: ALTER SEQUENCE sequence_name RESTART WITH 12345;
そこでどのように実行するかについては、独自の DB エンジンのドキュメントを参照してください。
他のヒント
MySQL の場合、syncdb の後にこれを行うシグナルを作成しました。
from django.db.models.signals import post_syncdb
from project.app import models as app_models
def auto_increment_start(sender, **kwargs):
from django.db import connection, transaction
cursor = connection.cursor()
cursor = cursor.execute("""
ALTER table app_table AUTO_INCREMENT=2000
""")
transaction.commit_unless_managed()
post_syncdb.connect(auto_increment_start, sender=app_models)
syncdb の後に、alter table ステートメントが実行されます。これにより、mysql にログインして手動で発行する必要がなくなります。
編集:これが古いスレッドであることは承知していますが、誰かの役に立つかもしれないと思いました。
これが私がやったことです..
def update_auto_increment(value=5000, app_label="remrate_data"):
"""Update our increments"""
from django.db import connection, transaction, router
models = [m for m in get_models() if m._meta.app_label == app_label]
cursor = connection.cursor()
for model in models:
_router = settings.DATABASES[router.db_for_write(model)]['NAME']
alter_str = "ALTER table {}.{} AUTO_INCREMENT={}".format(
_router, model._meta.db_table, value)
cursor.execute(alter_str)
transaction.commit_unless_managed()
auto フィールドは、使用されているデータベース ドライバーにある程度依存します。
何が起こっているかを確認するには、特定のデータベースに対して実際に作成されたオブジェクトを確認する必要があります。
簡単に覗いてみると、 ソース おそらく常に 1 ずつ増加するとは限らないため、これにはオプションがないようであることを示しています。次に利用可能なキーを選択します。「利用可能な ID に応じて自動的に増加する IntegerField」 — ジャンゴプロジェクト.com
同様のことをする必要がありました。複雑なことは避け、単純に 2 つのフィールドを作成しました。
id_no = models.AutoField(unique=True)
my_highvalue_id = models.IntegerField(null=True)
次に、views.py で、id_no に固定の数値を追加しました。
my_highvalue_id = id_no + 1200
それが問題の解決に役立つかどうかはわかりませんが、簡単な解決策であると思われると思います。