2010-08-20 3 views
6

У меня есть модель, которая выглядит примерно такСлучайное/непостоянное значение по умолчанию для поля модели?

class SecretKey(Model): 
    user = ForeignKey('User', related_name='secret_keys') 
    created = DateTimeField(auto_now_add=True) 
    updated = DateTimeField(auto_now=True) 
    key = CharField(max_length=16, default=randstr(length=16)) 
    purpose = PositiveIntegerField(choices=SecretKeyPurposes) 
    expiry_date = DateTimeField(default=datetime.datetime.now()+datetime.timedelta(days=7), null=True, blank=True) 

Вы заметите, что значение по умолчанию для key является случайной строкой 16 символов. Проблема в том, что я думаю, что это значение кэшируется и используется несколько раз подряд. Есть ли способ, которым я могу получить различную строку каждый раз? (Меня не интересуют уникальность/коллизии)

+1

Вы также должны применить ответ Даниила к 'expiry_date'. Вы не получите желаемый результат с текущим кодом. –

+0

@ [iquadrat: Да ... Я тоже это заметил. Благодарю. – mpen

ответ

10

Да, значение по умолчанию будет установлено только при инициализации метакласса Model, а не при создании нового экземпляра SecretKey.

Решение должно сделать значение по умолчанию callable, и в этом случае функция будет вызываться каждый раз, когда создается новый экземпляр.

def my_random_key(): 
    return randstr(16) 

class SecretKey(Model): 
    key = CharField(max_length=16, default=my_random_key) 

Вы можете, конечно, также установить значение в __init__ функции модели, но чище вызываемых объектов и по-прежнему будет работать со стандартным синтаксисом, как model = SecretKey(key='blah').

+2

Я мог бы просто пощекотать «лямбда:» перед ним, чтобы сделать его вызываемым, не так ли? – mpen

+0

Да, я думал об этом после того, как я разместил :) –

+0

Кстати, я бы хотел использовать экземпляры 'F()' в качестве значений по умолчанию. Я должен перестать быть ленивым и пойти заполнить билет на http://code.djangoproject.com ... someday – alanjds

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