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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top