数据库生成的Django和uuid

数据库生成的Django和uuid,django,postgresql,uuid,Django,Postgresql,Uuid,我正在使用Django和DRF创建一个RESTAPI。 我不想直接向客户机公开ID,所以我尝试设置我的模型,如以下示例所示: class AbstractGuidModel(models.Model): uuid = models.UUIDField(blank=True, default=uuid.uuid4, unique=True, editable=False) class Meta: abstract = True class MyModel(Abs

我正在使用Django和DRF创建一个RESTAPI。 我不想直接向客户机公开ID,所以我尝试设置我的模型,如以下示例所示:

class AbstractGuidModel(models.Model):
    uuid = models.UUIDField(blank=True, default=uuid.uuid4, unique=True, editable=False)

    class Meta:
        abstract = True

class MyModel(AbstractGuidModel):
    name = models.CharField(max_length=NAME_LENGTH)
由于AbstractGuidModel具有default=uuid.uuid4,因此uuid由python代码生成,迁移如下所示:

CREATE TABLE "MyModel" ( ... "uuid" uuid NOT NULL UNIQUE, ... );
我读过Postgres有一个自动生成UUID的扩展


一旦安装了扩展,我如何告诉django让数据库使用自己的扩展,而不让他使用Python uuid模块创建它们?

当您在django中使用UUIDField作为主键时,它不会为您生成uuid,而是在保存对象之前自己生成。您的代码可以做到这一点,并且运行良好


UUID字段将根据Postgres UUID字段进行存储。

我不想将UUID用作主键,我的模型仍然使用默认的数字自动增量ID。我使用uuid通过api公开记录,而不让api消费者知道关于记录的特殊信息(创建序列等)。我只希望Postgres自己生成uuid,而不是使用Python uuid ModuleEyes,您的代码可以做到这一点(生成uuid部分的Postgres除外)。“MyModel”对象将具有id、名称和uuid。Uuid将在保存到数据库之前由默认函数设置。在这种情况下,Postgres将填充的唯一值是id。