Как использовать 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.