How to get Django AutoFields to start at a higher number

心不动则不痛 提交于 2019-11-27 04:19:21

问题


For our Django App, we'd like to get an AutoField to start at a number other than 1. There doesn't seem to be an obvious way to do this. Any ideas?


回答1:


Like the others have said, this would be much easier to do on the database side than the Django side.

For Postgres, it'd be like so: ALTER SEQUENCE sequence_name RESTART WITH 12345; Look at your own DB engine's docs for how you'd do it there.




回答2:


For MySQL i created a signal that does this after 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)

After a syncdb the alter table statement is executed. This will exempt you from having to login into mysql and issuing it manually.

EDIT: I know this is an old thread, but I thought it might help someone.




回答3:


Here is what I did..

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:


The auto fields depend, to an extent, on the database driver being used.

You'll have to look at the objects actually created for the specific database to see what's happening.




回答5:


A quick peek at the source shows that there doesn't seem to be any option for this, probably because it doesn't always increment by one; it picks the next available key: "An IntegerField that automatically increments according to available IDs" — djangoproject.com




回答6:


I needed to do something similar. I avoided the complex stuff and simply created two fields:

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

In views.py, I then simply added a fixed number to the id_no:

my_highvalue_id = id_no + 1200

I'm not sure if it helps resolve your issue, but I think you may find it an easy go-around.



来源:https://stackoverflow.com/questions/117800/how-to-get-django-autofields-to-start-at-a-higher-number

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!