Django 2.2 + UUID作为ID +默认值

时间:2019-08-27 19:25:40

标签: django postgresql uuid

因此,我将其作为基本模型:

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类中,当我派生自此类并调用.save()一个新对象时,它将使用新的UUID创建。

但是,当我使用DataGrip之类的工具查看数据库模式(最新的Postgres)时,发现id列在default定义中什么都没有-为什么{{ 1}}以某种方式转换为数据库模式?

当我使用DataGrip编辑数据库时,必须手动插入新的UUID才能手动保存记录,以便正确保存。

有没有解决的办法?当我从第三方数据库客户端添加行时要自动生成UUID吗?

1 个答案:

答案 0 :(得分:4)

根据Django文档here

  

通用唯一标识符是AutoField的一个很好的替代选择,   首要的关键。数据库不会为您生成UUID,因此它是   建议使用默认值:

这意味着,不同于AutoField的{​​{1}}的默认值未在数据库级别实现(或在您的数据库实现了这种功能的情况下使用)。它在应用程序级别上处理。这就是为什么您必须传递默认值(UUIDField)的原因。每当插入记录时,就会调用uuid.uuid4函数来生成uuid,并将此值插入数据库中。如果您要直接插入,则必须自己处理。

但是,如果您通过在db之类的数据库上运行直接查询来为id列设置默认值,则

uuid.uuid4

Django不会对此抱怨。而且可以从django应用程序外部正常运行。

相关问题