Django 1.10 UUIDField返回字符串或UUID

时间:2017-04-24 14:28:55

标签: 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的行为方式与感觉不一致。

1 个答案:

答案 0 :(得分:0)

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

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