2015-09-11 15 views
12

Próbuję uzyskać unikalne identyfikatory dla moich obiektów Django. W Django 1.8 mają UUIDField. Nie jestem pewien, jak używać tego pola, aby generować unikalne identyfikatory dla każdego obiektu w moim modelu.jak używać UUID w Django

Oto co mam do 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() 

mogę odtworzyć identyfikator dla modelu UUID, ale za każdym razem mogę uzyskać dokładnie ten sam identyfikator. . :(Na przykład:

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

id wtedy daje mi ten sam identyfikator za każdym razem, co jest nie tak, jak to naprawić dziękuję za pomoc

Odpowiedz

27

nie jestem pewien dlaczego.? ... Wcześniej stworzył model UUID można dodać pole uuid bezpośrednio do modelu Person

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

Każda osoba powinna wtedy mieć unikalny identyfikator Jeśli chciał UUID być klucz podstawowy, to zrobić:

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

Twój obecny kod nie dodał pola do osoby. Stworzyła instancję MyUUIDModel podczas wykonywania MyUUIDModel() i zapisała ją jako atrybut klasy. Nie ma sensu, aby to zrobić, MyUUIDModel zostanie utworzony przy każdym ładowaniu modelu .py. Jeśli naprawdę chciałeś użyć MyUUIDModel, możesz użyć ForeignKey. Następnie każda osoba będzie łączyła się z inną instancją MyUUIDModel.

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

Jednak, jak już wspomniałem wcześniej, najłatwiejszym sposobem jest dodanie pola UUID bezpośrednio do osoby.

3

można bezpośrednio dodać pole id jako UUIDField w Person modelu. Nie ma potrzeby oddzielnego MyUUIDModel.

Chyba nie mylić go z MyUUIDModel stosowanego w UUIDField example gdzie id jest UUIDField. Możesz po prostu użyć poniższego kodu i użyje on UUIDs dla id.

import uuid 
from django.db import models 

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

Trzeba użyć utworzonej klasy jako podklasy podczas deklarowania model Person tak:

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): 
    ... 

W ten sposób człowiek staje się podklasą MyUUIDModel i będą dziedziczyć jego definicję pola id.

+0

wydaje się to uchwycić zamiar PO, tak myślę? – simon

Powiązane problemy