Как заставить 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
Я не уверен, поможет ли вам решить вашу проблему, но я думаю, вы можете легко найти ее.