2015-09-11 2 views
12

Я пытаюсь получить уникальные идентификаторы для своих объектов Django. В Django 1.8 у них есть UUIDField. Я не уверен, как использовать это поле, чтобы генерировать уникальные идентификаторы для каждого объекта в моей модели.Как использовать UUID в Django

Вот что у меня есть для 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 

идентификатор затем дает мне тот же идентификатор каждый раз, Что не так, как это исправить Спасибо за вашу помощь

ответ

27

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

3

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

Я думаю, вы спутали его с MyUUIDModel используется в UUIDField example где 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) 
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): 
    ... 

Таким образом, лицо становится подклассом MyUUIDModel и наследует свое определение поля идентификатора.

+0

Это похоже на намерение OP, я думаю? – simon

Смежные вопросы