Pregunta

Para nuestra aplicación Django, nos gustaría obtener una AutoField para comenzar en un número distinto de 1.No parece haber una forma obvia de hacer esto.¿Algunas ideas?

¿Fue útil?

Solución

Como han dicho los demás, esto sería mucho más fácil de hacer en el lado de la base de datos que en el lado de Django.

Para Postgres, sería al igual que: ALTER SEQUENCE sequence_name RESTART WITH 12345; Mire los documentos de su propio motor de base de datos para saber cómo lo haría allí.

Otros consejos

Para MySQL creé una señal que hace esto después de 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)

Después de un syncdb, se ejecuta la instrucción alter table.Esto le eximirá de tener que iniciar sesión en mysql y emitirlo manualmente.

EDITAR:Sé que este es un hilo antiguo, pero pensé que podría ayudar a alguien.

Aquí esta lo que hice..

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()

Los campos automáticos dependen, hasta cierto punto, del controlador de base de datos que se utilice.

Tendrás que mirar los objetos realmente creados para la base de datos específica para ver qué está sucediendo.

Un vistazo rápido a la fuente muestra que no parece haber ninguna opción para esto, probablemente porque no siempre se incrementa en uno;elige la siguiente clave disponible:"Un campo entero que aumenta automáticamente según los ID disponibles" — djangoproject.com

Necesitaba hacer algo similar.Evité las cosas complejas y simplemente creé dos campos:

id_no = models.AutoField(unique=True)
my_highvalue_id = models.IntegerField(null=True)

En views.py, simplemente agregué un número fijo al id_no:

mi_id_valor_alto = id_no + 1200

No estoy seguro de si esto ayuda a resolver su problema, pero creo que puede resultarle fácil solucionarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top