Django 2.2 + UUID 作为 ID + 默认值
Django 2.2 + UUID as ID + default values
所以我有这个作为基础模型:
class BaseModel(models.Model):
"""
base class for all models enforcing a UUID
"""
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
class Meta:
abstract = True
以编程方式,从我的 Django classes,当我从这个 class 派生并调用 .save()
一个新对象时,它是用一个新的 UUID 创建的。
但是,当我使用像 DataGrip 这样的工具查看数据库模式(最新的 Postgres)时,我发现 id
列在 default
定义中没有任何内容 - 为什么没有default=uuid.uuid4
以某种方式转换为数据库模式?
当我使用 DataGrip 编辑数据库时,我必须为我手动输入的记录手动插入一个新的 UUID 才能正确保存。
有办法解决这个问题吗?要在我从第 3 方数据库客户端添加行时自动生成 UUID?
根据 django 文档 here
Universally unique identifiers are a good alternative to AutoField for
primary_key. The database will not generate the UUID for you, so it is
recommended to use default:
这意味着,与 AutoField
不同,UUIDField
的默认值未在数据库级别实现(或者如果您的数据库实现了此类功能,则不使用)。它在应用程序级别处理。这就是您必须传递默认值 (uuid.uuid4
) 的原因。每当插入一条记录时,都会调用 uuid.uuid4
函数来生成一个 uuid 并将该值插入到数据库中。如果你做的是直接插入,你必须自己处理。
但是,如果您通过 运行 直接查询数据库来设置 id 列的默认值,例如
ALTER TABLE <TABLE_NAME> ALTER COLUMN id SET DEFAULT uuid_generate_v4();
Django 不会抱怨的。它在 django 应用程序外部也能正常工作。
所以我有这个作为基础模型:
class BaseModel(models.Model):
"""
base class for all models enforcing a UUID
"""
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
class Meta:
abstract = True
以编程方式,从我的 Django classes,当我从这个 class 派生并调用 .save()
一个新对象时,它是用一个新的 UUID 创建的。
但是,当我使用像 DataGrip 这样的工具查看数据库模式(最新的 Postgres)时,我发现 id
列在 default
定义中没有任何内容 - 为什么没有default=uuid.uuid4
以某种方式转换为数据库模式?
当我使用 DataGrip 编辑数据库时,我必须为我手动输入的记录手动插入一个新的 UUID 才能正确保存。
有办法解决这个问题吗?要在我从第 3 方数据库客户端添加行时自动生成 UUID?
根据 django 文档 here
Universally unique identifiers are a good alternative to AutoField for primary_key. The database will not generate the UUID for you, so it is recommended to use default:
这意味着,与 AutoField
不同,UUIDField
的默认值未在数据库级别实现(或者如果您的数据库实现了此类功能,则不使用)。它在应用程序级别处理。这就是您必须传递默认值 (uuid.uuid4
) 的原因。每当插入一条记录时,都会调用 uuid.uuid4
函数来生成一个 uuid 并将该值插入到数据库中。如果你做的是直接插入,你必须自己处理。
但是,如果您通过 运行 直接查询数据库来设置 id 列的默认值,例如
ALTER TABLE <TABLE_NAME> ALTER COLUMN id SET DEFAULT uuid_generate_v4();
Django 不会抱怨的。它在 django 应用程序外部也能正常工作。