Django迁移错误无法适应UUID类型

时间:2015-08-19 07:51:11

标签: python django django-models django-orm

我已经改变了我的模型PK:

id = models.CharField(primary_key=True, unique=True, default=make_key, max_length=32)

到这个

id = models.UUIDField(primary_key=True, unique=True, default=TimeUUID, editable=False)

TimeUUID is this function。但是,我在下面运行迁移时遇到错误,为什么?

数据库中没有数据我清除了所有行。 该函数生成如下所示的UUID:

00332873-d693-da82-720e-27dff1cf2a9b
00332873-d693-db36-dd92-eac7c082f13c
00332873-d693-dc0a-aef8-9fb752a3fb6c

即。 [32 bits timestamp high]-[16 bits timestamp mid]-[16 bits timestamp low]-[16 bits random]-[48 bits random]

数据库是Postgres。

错误:

  File "/Users/user/Documents/app/env/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: can't adapt type 'TimeUUID'

可能是Django UUID字段不接受具有不同顺序的位的UUID吗?

也尝试过:

def get_UUID():
    return TimeUUID()

然后

id = models.UUIDField(primary_key=True, unique=True, default=get_UUID, editable=False)

仍然会出现同样的错误。

1 个答案:

答案 0 :(得分:1)

TimeUUID是一个类。调用它会返回该类的实例。 Django不知道如何处理该值,因为不知道如何将其存储为数据库中的值。

要使用它,您需要将其转换为字符串。你可以在lambda中做到这一点:

id = models.UUIDField(
    primary_key=True, unique=True, default=lambda: str(TimeUUID()), editable=False)