Django 1.10的UUIDField返回字符串或UUID

3

当我从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的行为方式,因为它感觉不一致。


创建“用户”时,您是否始终依赖于默认值(uuid.uuid4)?还是有时手动输入? - itzMEonTV
@itzmeontv,1.9.13和1.10.7下列语句完全相同。在这两种情况下,我使用UUIDField默认值,即uuid.uuid4可调用。 - Michel Rugenbrink
1个回答

0
问题是由于Django的AbstractBaseUser类中行为的更改引起的。 该类接收了一个clean方法,我在保存时调用了它。在新的clean方法内部,调用了normalize_username方法,强制将用户名转换为文本。
通过避免对AbstractBaseUser的超级调用,我们不再规范化用户名,这也不是我们想要的,因为我们的用户名字段是UUID。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接