Вопрос:

как использовать UUID в Django

python django django-models uuid

30531 просмотра

4 ответа

495 Репутация автора

Я пытаюсь получить уникальные идентификаторы для моих объектов 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 каждый раз дает мне один и тот же идентификатор. Что не так, как мне это исправить? Спасибо за помощь!

Автор: Chad Crowe Источник Размещён: 11.09.2015 04:37

Ответы (4)


61 плюса

192515 Репутация автора

Решение

Я не уверен, почему вы создали модель 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 непосредственно к человеку.

Автор: Alasdair Размещён: 11.09.2015 04:40

5 плюса

29735 Репутация автора

Вы можете напрямую добавить idполе как UUIDFieldв Personмодель . Там нет необходимости в отдельном MyUUIDModel.

Я думаю, что вы перепутали это с MyUUIDModelиспользуемым в примере UUIDField, где ida 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) 
Автор: Rahul Gupta Размещён: 11.09.2015 04:50

6 плюса

63 Репутация автора

Вы должны использовать класс, который вы создали, как подкласс при объявлении вашей модели 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.

Автор: Sylvestre Размещён: 04.07.2017 03:36

0 плюса

25 Репутация автора

Чтобы использовать UUID в Django для новой модели, смотрите Django Docs .

Однако, если вы хотите использовать его для существующей моделиunique = True ), имеющей соответствующие данные, вы не сможете сделать это напрямую с помощью вышеуказанной документации. Это создаст ошибки миграции . Чтобы сделать это без потери данных, внимательно следуйте всем шагам этой документации Django .

Автор: Jatin Goyal Размещён: 13.06.2019 06:09
Вопросы из категории :
32x32