Django 1.10 UUIDField 返回字符串或 UUID

标签 django django-models django-1.10

从 Django 1.9.13 升级到 Django 1.10.7 时,我遇到了 Django 的原生 UUIDField 的奇怪问题。

我们在自定义用户模型上使用此 UUIDField,例如:

username = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

在 1.9 中,这总是返回一个 UUID 实例。 在 1.10 中,这会在创建新模型实例时返回一个字符串。

比较下面的测试例子:

1.9.13

>>> u = User.objects.last()
>>> u2 = UserFactory()
>>> u3 = User.objects.create()
>>> u.pk
UUID('e7e0f87d-1ed4-4293-829f-b0b745ccd676')
>>> u2.pk
UUID('f8e9a4a9-2265-4cd7-9813-00ffe7fd922a')
>>> u3.pk
UUID('0cb736d7-f8a0-4057-9c89-44fa114f4f82')

1.10.7

>>> u = User.objects.last()
>>> u2 = UserFactory()
>>> u3 = User.objects.create()
>>> u.pk
UUID('e7e0f87d-1ed4-4293-829f-b0b745ccd676')
>>> u2.pk
'f8e9a4a9-2265-4cd7-9813-00ffe7fd922a'
>>> u3.pk
'0cb736d7-f8a0-4057-9c89-44fa114f4f82'

这种差异给各种单元测试带来了问题。我可以通过强制两者都使用字符串来解决它,但我想了解为什么 UUIDField 的行为方式感觉不一致。

最佳答案

问题是由 Django 的 AbstractBaseUser 类中的行为改变引起的。 该类收到了一个干净的方法,我在保存时调用了该方法。在新的 clean 方法中调用了 normalize_username 方法,强制用户名成为文本。

通过避免对 AbstractBaseUser 的 super 调用,我们不再规范化用户名,这不是我们想要的,因为我们的用户名字段是 UUID。

关于Django 1.10 UUIDField 返回字符串或 UUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43590827/

相关文章:

python2.7在virtualenv中安装MySQL-python错误 "failed with exit status 2"

database - 如何决定是否需要从 sqlite 过渡

Python Django : models in root giving error

python - DRF auth_token : "non_field_errors": [ "Unable to log in with provided credentials."

python - 错误 : The 'elasticsearch' backend requires the installation of 'requests' . 如何修复?

python - Django基础模板 View 方法

python - 使用自定义中间表的 Django ManyToMany 关系查询集

django - 你如何为 Django ForeignKey 字段指定默认值?

python - 按可选的开始和结束日期过滤查询集

django - 打开新的浏览器选项卡会使 Django 的 CSRF token 失效,从而阻止表单提交