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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top