因此,我将其作为基本模型:
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吗?
答案 0 :(得分:4)
根据Django文档here
通用唯一标识符是AutoField的一个很好的替代选择, 首要的关键。数据库不会为您生成UUID,因此它是 建议使用默认值:
这意味着,不同于AutoField
的{{1}}的默认值未在数据库级别实现(或在您的数据库实现了这种功能的情况下使用)。它在应用程序级别上处理。这就是为什么您必须传递默认值(UUIDField
)的原因。每当插入记录时,就会调用uuid.uuid4
函数来生成uuid,并将此值插入数据库中。如果您要直接插入,则必须自己处理。
但是,如果您通过在db之类的数据库上运行直接查询来为id列设置默认值,则
uuid.uuid4
Django不会对此抱怨。而且可以从django应用程序外部正常运行。