Come far iniziare Django AutoFields a un numero più alto
Domanda
Per la nostra app Django, vorremmo ottenere un AutoField
per iniziare da un numero diverso da 1. Non sembra esserci un modo ovvio per farlo. Qualche idea?
Soluzione
Come hanno detto gli altri, questo sarebbe molto più facile da fare sul lato database rispetto al lato Django.
Per Postgres, sarebbe in questo modo : ALTER SEQUENCE sequenza_name RIAVVIA CON 12345;
Guarda i documenti del tuo motore DB per come lo faresti lì.
Altri suggerimenti
Per MySQL ho creato un segnale che fa questo dopo 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)
Dopo un syncdb viene eseguita l'istruzione alter table. Questo ti esonererà dal dover accedere a mysql e rilasciarlo manualmente.
EDIT: so che questo è un vecchio thread, ma ho pensato che potesse aiutare qualcuno.
Ecco cosa ho fatto ..
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()
I campi automatici dipendono, in una certa misura, dal driver del database in uso.
Dovrai guardare gli oggetti effettivamente creati per il database specifico per vedere cosa sta succedendo.
Una rapida occhiata al source mostra che non sembra esserci alcuna opzione per questo, probabilmente perché non aumenta sempre di uno; seleziona la chiave disponibile successiva: " Un IntegerField che si incrementa automaticamente in base agli ID disponibili " & # 8212; djangoproject.com
Avevo bisogno di fare qualcosa di simile. Ho evitato le cose complesse e ho semplicemente creato due campi:
id_no = models.AutoField(unique=True)
my_highvalue_id = models.IntegerField(null=True)
In views.py, ho semplicemente aggiunto un numero fisso a id_no:
my_highvalue_id = id_no + 1200
Non sono sicuro che aiuti a risolvere il problema, ma penso che potresti trovarlo un modo semplice per risolvere il problema.