如何在 Django 中创建一个不需要提供默认函数,而是返回数据库生成的 UUID?



目前Django UUIDField如何在Postgresql中生成UUID的首要答案是什么?表示

当您在Django中使用UUIDField作为主键时,它不会为您生成UUID,而是在保存对象之前自己生成

但我认为应该有可能破解一个允许基于DB的UUID生成的解决方案。

一旦您在postgres 中安装了uuid-ossp扩展

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

我认为它应该或多或少像AutoField一样工作。

如果原始sql已用于表创建

CREATE TABLE example(
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
);

然后原始插入将返回一个新的随机UUID作为id字段。

如何创建一个自定义的Field,使这个原始解决方案与Django ORM一起工作?

我刚刚找到了一年前问的这个问题的解决方案。Django为您提供了RandomUUID,它在PostgreSQL中调用gen_random_uuid

示例用法:

from django.contrib.postgres.functions import RandomUUID
class MyModel(models.Model):
id = models.UUIDField(primary_key=True, default=RandomUUID)

其中RandomUUID

class RandomUUID(Func):
template = 'GEN_RANDOM_UUID()'
output_field = UUIDField()

对于低于13版本的PostgreSQL文档,提到调用gen_random_uuid

返回版本4(随机(UUID。(过时了,这个功能现在也包含在核心PostgreSQL中。(

它已经过时,因为"在pgcrypto中过时";扩大

在PostgreSQL 13及以上版本的文档中,您可以在第9章中找到这个函数。函数和运算符部分

此函数返回版本4(随机(UUID。这是最常用的UUID类型,适用于大多数应用程序。

最新更新