Как использовать UUID в Django
Я пытаюсь получить уникальные идентификаторы для своих объектов Django. В Django 1.8 у них есть UUIDField. Я не уверен, как использовать это поле, чтобы генерировать уникальные идентификаторы для каждого объекта в моей модели.
Вот что у меня для 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, но каждый раз я получаю точный идентификатор.: (Например:
person = Person.objects.get(some_field = some_thing)
id = person.unique_id.id
id тогда дает мне тот же самый идентификатор каждый раз. Что не так, как я могу это исправить? Спасибо за помощь!
Ответы
Ответ 1
Я не уверен, почему вы создали модель UUID. Вы можете добавить поле uuid непосредственно в модель Person.
class Person(models.Model):
unique_id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
Каждый человек должен иметь уникальный идентификатор. Если вы хотите, чтобы uuid был основным ключом, вы бы сделали:
class Person(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
Ваш текущий код не добавил поля человеку. Он создал экземпляр MyUUIDModel
, когда вы делаете MyUUIDModel(), и сохранили его как атрибут класса. Это не имеет смысла делать, MyUUIDModel
будет создаваться каждый раз при загрузке models.py. Если вы действительно хотели использовать MyUUIDModel, вы можете использовать ForeignKey
. Затем каждый человек будет ссылаться на другой экземпляр MyUUIDModel.
class Person(models.Model):
...
unique_id = models.ForeignKey(MyUUIDModel, unique=True)
Однако, как я сказал ранее, самый простой подход заключается в том, чтобы добавить поле UUID непосредственно к человеку.
Ответ 2
Вам нужно использовать класс, который вы создали в качестве подкласса, при объявлении вашей модели 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 и наследует его определение поля идентификатора.
Ответ 3
Вы можете напрямую добавить поле id
как UUIDField
в модели Person
. Нет необходимости в отдельной MyUUIDModel
.
Я думаю, что вы перепутали это с MyUUIDModel
использованным в примере UUIDField, где id
является UUIDField
. Вы можете просто использовать приведенный ниже код, и он будет использовать UUIDs
для id
.
import uuid
from django.db import models
class Person(models.Model):
...
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
Ответ 4
Чтобы использовать UUID в Django для новой модели, смотрите Django Docs.
Однако, если вы хотите использовать его для существующей модели (с unique = True), имеющей соответствующие данные, вы не сможете сделать это напрямую с помощью вышеуказанной документации. Это создаст ошибки миграции. Чтобы сделать это без потери данных, внимательно следуйте всем шагам этой документации Django.