Случайное / непостоянное значение по умолчанию для поля модели? - PullRequest
7 голосов
/ 21 августа 2010

У меня есть модель, которая выглядит примерно так

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 Ответ

11 голосов
/ 21 августа 2010

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

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

def my_random_key():
    return randstr(16)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...