2014-09-14 2 views
5

Я заметил странное поведение значения по умолчанию в модели django. Например, у нас есть простой Джанго модель:UUID как значение по умолчанию в модели 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()) 

При создании нового пользователя, и после того, что еще один так:

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

Джанго составляет 2 пользователей с тем же activation_key

Но тогда я делаю это так:

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() 

Все работает отлично d Django создает 2 пользователя с разными ключами активации.

Что здесь происходит? Python загружает объект модели и вычисляет значение по умолчанию модели при запуске приложения wsgi или что? Почему uuid дает одни и те же значения в первом случае, но отличается во втором?

Спасибо.

+1

Как отмечает @Rohan, он должен быть вызываемым. Вот соответствующая документация https://docs.djangoproject.com/en/dev/ref/models/fields/#default – karthikr

ответ

16

Проблема является default атрибут, который вы настраиваете, как

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

Здесь вы устанавливаете значение по умолчанию, как не отозваны, но значение, возвращенное uuid.uuid1() вызова при инициализации этой модели класса.

Вы должны установить его как default=uuid.uuid1, который устанавливает его как вызываемый, и устанавливает новый uuid каждый раз, когда необходимо использовать новое значение по умолчанию.

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