Как заставить Django AutoFields начинаться с большего числа

Для нашего приложения Django мы хотели бы, чтобы AutoField начинался с числа, отличного от 1. Кажется, нет очевидного способа сделать это. Любые идеи?

Ответы

Ответ 1

Как и другие, это было бы намного проще сделать на стороне базы данных, чем на стороне Django.

Для Postgres это будет так:: ALTER SEQUENCE sequence_name RESTART WITH 12345; Посмотрите на свои собственные документы по движку БД, как вы это сделаете.

Ответ 2

Для 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 и выдачи его вручную.

EDIT: Я знаю, что это старый поток, но я подумал, что это может помочь кому-то.

Ответ 3

Вот что я сделал.

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

Ответ 4

Быстрый просмотр в source показывает, что для этого не существует какой-либо опции, возможно потому, что это не всегда увеличение на единицу; он выбирает следующий доступный ключ: "IntegerField, который автоматически увеличивается в соответствии с доступными идентификаторами" - djangoproject.com

Ответ 5

Автополе зависят от используемого драйвера базы данных.

Вам нужно будет посмотреть объекты, созданные для конкретной базы данных, чтобы увидеть, что происходит.

Ответ 6

Мне нужно было сделать что-то подобное. Я избегал сложных вещей и просто создал два поля:

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

В views.py я просто добавил фиксированное число в id_no:

my_highvalue_id = id_no + 1200

Я не уверен, поможет ли вам решить вашу проблему, но я думаю, вы можете легко найти ее.