私たちのDjangoアプリでは、1以外の番号から始めたいと思いAutoField
ます。これを行うための明白な方法はないようです。何か案は?
8 に答える
他の人が言ったように、これは 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 にログインして手動で発行する必要がなくなります。
編集:これが古いスレッドであることは知っていますが、誰かの助けになるかもしれないと思いました。
ソースをざっと見てみると、これにはオプションがないように見えます。おそらく、常に 1 ずつ増加するとは限らないためです。次に利用可能なキーを選択します: 「利用可能な ID に応じて自動的に増加する IntegerField」 — djangoproject.com
これが私がしたことです..
def update_auto_increment(value=5000, app_label="xxx_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()
これに対する本当に簡単な解決策を見つけました!AutoField は、次に割り当てられる値を決定するために使用された以前の値を使用します。そのため、必要な AutoField の開始値にダミー値を挿入すると、次の挿入でその値からインクリメントされることがわかりました。
いくつかのステップでの簡単な例:
1.) モデル.py
class Product(models.Model):
id = model.AutoField(primaryKey=True) # this is a dummy PK for now
productID = models.IntegerField(default=0)
productName = models.TextField()
price = models.DecimalField(max_digits=6, decimal_places=2)
- 移行する
- 移行する
それが完了したら、「productID」が目的の AutoField 開始値の値を保持する最初の行を挿入する必要があります。メソッドを記述したり、django シェルから実行したりできます。
ビューから、挿入は次のようになります。
from app.models import Product
dummy = {
'productID': 100000,
'productName': 'Item name',
'price': 5.98,
}
Products.objects.create(**product)
挿入したら、モデルに次の変更を加えることができます。
models.py
class Product(models.Model):
productID = models.AutoField(primary_key=True)
productName = models.TextField()
price = models.DecimalField(max_digits=6, decimal_places=2)
以降の挿入はすべて、100000...100001...100002... から始まる「productID」を取得します。
auto フィールドは、使用されているデータベース ドライバにある程度依存します。
何が起こっているかを確認するには、特定のデータベース用に実際に作成されたオブジェクトを調べる必要があります。