web-dev-qa-db-ja.com

DjangoでUUIDを使用する方法

Djangoオブジェクト。一意のIDを取得しようとしています。Django 1.8にはUUIDFieldがあります。モデル内の各オブジェクトの一意のID。

UUIDFieldに私が持っているものがあります

import uuid
from Django.db import models

class MyUUIDModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

class Person(models.Model):
    ...
    unique_id = MyUUIDModel()

UUIDモデルのIDを再現できますが、毎回まったく同じIDを取得します。 :(。 例えば:

person = Person.objects.get(some_field = some_thing)
id = person.unique_id.id

idは毎回同じidをくれます。何が問題なのですか、どうすれば修正できますか?ご協力ありがとうございました!

35
Chad Crowe

UUIDモデルを作成した理由がわかりません。 uuidフィールドをPersonモデルに直接追加できます。

class Person(models.Model):
    unique_id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)

各人は一意のIDを持っている必要があります。 uuidを主キーにしたい場合は、次のようにします。

class Person(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

現在のコードでは、人にフィールドが追加されていません。 MyUUIDModel()を実行するとMyUUIDModelインスタンスが作成され、クラス属性として保存されます。それは理にかなっていません。models.pyがロードされるたびにMyUUIDModelが作成されます。本当にMyUUIDModelを使用したい場合は、 ForeignKey を使用できます。次に、各ユーザーは異なるMyUUIDModelインスタンスにリンクします。

class Person(models.Model):
    ...
    unique_id = models.ForeignKey(MyUUIDModel, unique=True)

ただし、前述したように、最も簡単な方法はUUIDフィールドを直接人に追加することです。

68
Alasdair

次のようにPersonモデルを宣言するとき、サブクラスとして作成したクラスを使用する必要があります。

import uuid
from Django.db import models

class MyUUIDModel(models.Model):
  id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

class Person(MyUUIDModel):
  ...

このようにして、PersonはMyUUIDModelのサブクラスになり、idフィールド定義を継承します。

6
Sylvestre

idフィールドをUUIDFieldモデルの Person として直接追加できます。別のMyUUIDModelは必要ありません。

IDFieldの例 で使用されているMyUUIDModelと混同していると思います。ここで、idUUIDFieldです。以下のコードを使用するだけで、UUIDsidを使用できます。

import uuid
from Django.db import models

class Person(models.Model):
    ...
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
5
Rahul Gupta

Djangoで新しいモデルでUUIDを使用するには、 Django Docs を参照してください。

ただし、既存のモデルに使用する場合(withunique = True)with dataそれに対応して、上記のドキュメントでは直接行うことはできません。 移行エラーが作成されます。データを失わずにこれを行うには、この Django Documentation のすべての手順を慎重に実行してください。

0
Jatin Goyal