Como chegar Django AutoFields iniciar em um número maior
Pergunta
Para o nosso Django App, gostaríamos de ter uma AutoField
para começar em um número diferente de 1. Não parece ser uma maneira óbvia de fazer isso. Alguma idéia?
Solução
Como os outros disseram, isso seria muito mais fácil fazer no lado do banco de dados do que o lado do Django.
Para Postgres, seria como assim : Olhe ALTER SEQUENCE sequence_name RESTART WITH 12345;
em docs do seu próprio motor DB para como você faria lá.
Outras dicas
Para o MySQL eu criei um sinal que faz isso apó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)
Depois de um syncdb a instrução ALTER TABLE é executado. Isso vai isentá-lo de ter que logar no mysql e emitir-lo manualmente.
EDIT:. Eu sei que isto é uma discussão antiga, mas eu pensei que poderia ajudar alguém
Aqui está o que eu fiz ..
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()
Os campos de automóveis depende, em certa medida, sobre o driver de banco de dados a ser utilizado.
Você tem que olhar para os objetos realmente criados para o banco de dados específico para ver o que está acontecendo.
Uma espiada na espectáculos de origem que não parece haver nenhuma opção para isso, provavelmente porque nem sempre incrementa por um; ele pega a próxima chave disponível: "Um IntegerField que automaticamente incrementos de acordo com IDs disponíveis" - djangoproject.com
Eu precisava fazer algo similar. Evitei o material complexo e simplesmente criou dois campos:
id_no = models.AutoField(unique=True)
my_highvalue_id = models.IntegerField(null=True)
Em views.py, então eu simplesmente adicionado um número fixo ao id_no:
my_highvalue_id = id_no + 1200
Eu não tenho certeza se isso ajuda a resolver o problema, mas eu acho que você pode achar que é um fácil go-around.