Изграждам модел с UUIDField като първичен ключ. Но моят случай на употреба изисква. има и поле за автоматично нарастване. Django предоставя AutoField. Но се изисква да има primary_key=True, което в моя случай е нещо, което не искам, тъй като използвам UUIDField като primary_key.
Опитах да създам поле и дадох db_type на 'serial' и добавих миграция, която променя последователността да се рестартира на 100 000.. Добавянето на обект към базата данни с помощта на Admin винаги ще съхранява числовото поле като нулева стойност. и ако премахна null=True. Тогава запазването ще се провали, тъй като ще изисква стойност за числовото поле.
Как мога да направя числовото поле инкрементално, като същевременно запазя UUIDField като първичен ключ?
fields.py
class SerialField(models.Field):
description = _("BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE")
empty_strings_allowed = False
default_error_messages = {
'invalid': _("'%(value)s' value must be an integer."),
}
def __init__(self, *args, **kwargs):
kwargs['blank'] = True
super().__init__(*args, **kwargs)
def db_type(self, connection):
return 'serial'
models.py
from .fields import SerialField
class MyModel(models.Model):
uuid = models.UUIDField(
verbose_name=_("UUID Identifier"),
primary_key=True,
default=uuid.uuid4,
editable=False,
help_text=_("Requried, PrimaryKey none-editable"),
db_index=True,
)
number = SerialField(
primary_key=False,
editable=False,
help_text=_("Auto Increment Number"),
verbose_name=_("Number"),
#null=True
)
0002_auto_20180202.py
от django.db импортиране на миграции
def forwards(apps, schema_editor):
if schema_editor.connection.alias == 'default':
return migrations.RunSQL(
"ALTER SEQUENCE app_name_mymodel_number_seq RESTART WITH 100000"
)
class Migration(migrations.Migration):
dependencies = [
('activities', '0001_initial'),
]
operations = [
migrations.RunPython(forwards)
]
AutoFields
). Съгласен съм, че това не е правилно документирано. - person Kevin Christopher Henry   schedule 24.03.2018