Como chegar Django AutoFields iniciar em um número maior

votos
14

Para o nosso Django App, gostaríamos de obter um AutoFieldpara começar em um número diferente de 1. Não parece ser uma maneira óbvia de fazer isso. Alguma ideia?

Publicado 22/09/2008 em 22:37
fonte usuário
Em outras línguas...                            


6 respostas

votos
14

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 : ALTER SEQUENCE sequence_name RESTART WITH 12345;Olhe para docs do seu próprio motor DB para como você faria lá.

Respondeu 23/09/2008 em 01:25
fonte usuário

votos
7

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 entrar no mysql e emitir-lo manualmente.

EDIT: Eu sei que esta é uma discussão antiga, mas eu pensei que poderia ajudar alguém.

Respondeu 17/06/2011 em 16:48
fonte usuário

votos
2

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()
Respondeu 10/03/2013 em 00:58
fonte usuário

votos
1

Os campos de automóveis depende, em certa medida, sobre o driver de banco de dados a ser utilizado.

Você vai ter que olhar para os objetos realmente criados para o banco de dados específico para ver o que está acontecendo.

Respondeu 23/09/2008 em 01:03
fonte usuário

votos
1

Uma espiada na fonte mostra 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 incrementa automaticamente de acordo com os IDs disponíveis" - djangoproject.com

Respondeu 22/09/2008 em 22:44
fonte usuário

votos
0

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.

Respondeu 28/01/2018 em 20:58
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more