Как получить Django AutoFields, чтобы начать с большего числа - PullRequest
19 голосов
/ 23 сентября 2008

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

Ответы [ 6 ]

18 голосов
/ 23 сентября 2008

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

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

8 голосов
/ 17 июня 2011

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

РЕДАКТИРОВАТЬ: Я знаю, что это старая тема, но я подумал, что это может кому-то помочь.

2 голосов
/ 10 марта 2013

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

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()
1 голос
/ 23 сентября 2008

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

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

1 голос
/ 23 сентября 2008

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

0 голосов
/ 28 января 2018

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

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

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

my_highvalue_id = id_no + 1200

Я не уверен, поможет ли это решить вашу проблему, но я думаю, что вам может показаться, что это просто.

...