【发布时间】:2018-09-02 20:14:42
【问题描述】:
我正在构建一个以 UUIDField 作为主键的模型。但我的用例需要。也有一个自动增量字段。 Django 提供了一个 AutoField。但它需要 primary_key=True 在我的情况下这是我不想要的,因为我使用 UUIDField 作为 primary_key。
我尝试创建一个字段并将 db_type 设置为“serial”并添加一个迁移,该迁移会更改在 100000 处重新启动的序列。使用 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)
]
【问题讨论】:
-
我没有答案,但您可以在this ticket 中看到一些历史记录(尽管讨论主要是关于拥有多个
AutoFields)。我同意这没有正确记录。
标签: python django database postgresql migration