Question

Pour notre application Django, nous aimerions qu'un AutoField commence par un nombre autre que 1. Il ne semble pas que ce soit une façon évidente de le faire. Des idées?

Était-ce utile?

La solution

Comme les autres l’ont dit, ce serait beaucoup plus facile à faire côté base de données que côté Django.

Pour Postgres, ce serait comme ça : ALTER SEQUENCE nom-séquence RESTART WITH 12345; Consultez la documentation de votre propre moteur de base de données pour connaître la procédure à suivre.

Autres conseils

Pour MySQL, j'ai créé un signal qui le fait après 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)

Après syncdb, l'instruction alter table est exécutée. Cela vous évitera d'avoir à vous connecter à mysql et à le publier manuellement.

EDIT: Je sais que c’est un vieux sujet, mais j’ai pensé que cela pourrait aider quelqu'un.

Voici ce que j'ai fait ..

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

Les champs automatiques dépendent, dans une certaine mesure, du pilote de base de données utilisé.

Vous devrez examiner les objets créés pour la base de données spécifique pour voir ce qui se passe.

Coup d'œil rapide sur le La source montre qu'il ne semble y avoir aucune option pour cela, probablement parce qu'elle n'incrémente pas toujours d'une unité; il sélectionne la clé disponible suivante: "Un IntegerField qui s'incrémente automatiquement en fonction des identifiants disponibles" & # 8212; djangoproject.com

Je devais faire quelque chose de similaire. J'ai évité les choses complexes et créé simplement deux champs:

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

Dans views.py, j’ai simplement ajouté un nombre fixe à l’id_no:

my_highvalue_id = id_no + 1200

Je ne sais pas si cela vous aidera à résoudre votre problème, mais je pense que vous trouverez peut-être qu'il est facile de le contourner.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top