2014-09-14 20 views
5

Zauważyłem dziwne zachowanie domyślnej wartości w modelu django. Na przykład mamy prostego modelu django:UUID jako wartość domyślna w modelu Django

import uuid 
... 

class SiteUser(models.Model): 
    ... 
    username = models.CharField(max_length=255, verbose_name=u"Username") 
    activation_key = models.CharField(max_length=64, verbose_name=u"Activation key", default=uuid.uuid1()) 

Podczas tworzenia nowego użytkownika, a potem jeszcze jeden tak:

user_a = SiteUser(username="UserA") 
user_a.save() 
user_b = SiteUser(username="UserB") 
user_b.save() 

Django sprawia 2 użytkowników z tego samego activation_key

Ale potem robię to tak:

user_a = SiteUser(username="UserA") 
user_a.activation_key = uuid.uuid1() 
user_a.save() 
user_b = SiteUser(username="UserB") 
user_b.activation_key = uuid.uuid1() 
user_b.save() 

Wszystko działa dobrze d Django tworzy 2 użytkowników z różnymi kluczami aktywacyjnymi.

Co tu się dzieje? Python wczytuje obiekt modelu i oblicza domyślną wartość modelu, gdy uruchamia się aplikacja wsgi? Dlaczego uuid podaje te same wartości w pierwszym przypadku, ale inne w drugim?

Dzięki.

+1

Jak wspomina @Rohan, musi być wymagalne. Oto odpowiednia dokumentacja https://docs.djangoproject.com/en/dev/ref/models/fields/#default – karthikr

Odpowiedz

16

Problem jest atrybutem, który ustawiasz jako

activation_key = models.CharField(max_length=64, verbose_name=u"Activation key", 
       default=uuid.uuid1()) 

Tu ustawiasz domyślną wartość jako nie wywoływalnym lecz wartość zwracana przez uuid.uuid1() rozmowy kiedy ten model klasy jest inicjowany default.

Powinieneś ustawić ją jako default=uuid.uuid1, która ustawia ją jako wywoływaną, i ustawia nową wartość za każdym razem, gdy trzeba użyć nowej wartości domyślnej.

Powiązane problemy