كيفية جعل Django AutoFields يبدأ برقم أعلى
سؤال
بالنسبة لتطبيق Django الخاص بنا، نود الحصول على AutoField
للبدء برقم آخر غير 1.لا يبدو أن هناك طريقة واضحة للقيام بذلك.أيه أفكار؟
المحلول
كما قال الآخرون، سيكون القيام بذلك على جانب قاعدة البيانات أسهل بكثير من القيام به على جانب جانغو.
بالنسبة لـ Postgres، سيكون الأمر كذلك مثل ذلك: ALTER SEQUENCE sequence_name RESTART WITH 12345;
انظر إلى مستندات محرك قاعدة البيانات الخاصة بك لمعرفة كيفية القيام بذلك هناك.
نصائح أخرى
بالنسبة إلى 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 يتم تنفيذ بيان جدول التغيير.سيعفيك هذا من الاضطرار إلى تسجيل الدخول إلى 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()
تعتمد الحقول التلقائية، إلى حد ما، على برنامج تشغيل قاعدة البيانات المستخدم.
سيتعين عليك إلقاء نظرة على الكائنات التي تم إنشاؤها بالفعل لقاعدة البيانات المحددة لمعرفة ما يحدث.
نظرة سريعة على مصدر يوضح أنه لا يبدو أن هناك أي خيار لهذا، ربما لأنه لا يتزايد دائمًا بمقدار واحد؛يختار المفتاح التالي المتاح:"IntegerField الذي يتزايد تلقائيًا وفقًا للمعرفات المتاحة" - djangoproject.com
كنت بحاجة إلى القيام بشيء مماثل.لقد تجنبت الأشياء المعقدة وقمت ببساطة بإنشاء حقلين:
id_no = models.AutoField(unique=True)
my_highvalue_id = models.IntegerField(null=True)
في ملف view.py، قمت ببساطة بإضافة رقم ثابت إلى id_no:
my_highvalue_id = id_no + 1200
لست متأكدًا مما إذا كان ذلك يساعد في حل مشكلتك، ولكن أعتقد أنك قد تجده حلاً سهلاً.