2017-04-24 1 views
3

のいずれかを返します。これは常にUUIDインスタンスを返す1.9でジャンゴ1.10 UUIDFieldは、私は、DjangoのネイティブUUIDFieldで奇妙な問題が発生した文字列またはUUID

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

は、我々は次のように私たちのカスタム・ユーザー・モデルにこのUUIDFieldを使用しています。 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はそれが一貫性のない感じのようにそれがないように動作理由を理解したいです。

+0

すべてのケースでは、デフォルト( 'uuid.uuid4')に依存している、' User'を作成しますか?または時にはそれを手動で与えているのですか? – itzMEonTV

+0

@itzmeontv 1.9.13と1.10.7の両方に記載されているステートメントは正確です。どちらの場合も、uuid.uuid4を呼び出し可能なUUIDFIeldのデフォルト値を使用します。 –

答えて

0

問題は、DjangoのAbstractBaseUserクラスに変更された行動によって引き起こされました。 クラスはsaveメソッドを呼び出しました。新しいクリーンメソッドの中で、ユーザー名をテキストにするnormalize_usernameメソッドが呼び出されました。私たちは、もはや私たちのユーザー名フィールドがUUIDであるとして、我々はとにかく望んでいたものではありませんユーザー名を正規化するAbstractBaseUserにスーパーの呼び出しを回避することによって