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

StackOverflow https://stackoverflow.com/questions/117800

  •  02-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

my_highvalue_id = id_no + 1200

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top