【问题标题】:Random/non-constant default value for model field?模型字段的随机/非常量默认值?
【发布时间】:2014-12-02 23:48:56
【问题描述】:

我有一个看起来像这样的模型

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 个字符的字符串。问题是,我认为这个值被缓存并连续使用了好几次。有什么办法可以让我每次都得到不同的字符串? (我不关心唯一性/冲突)

【问题讨论】:

  • 您也应该将 Daniel 的回答应用于 expiry_date。使用当前代码不会得到想要的结果。
  • @[iquadrat: 是的……我也注意到了。谢谢。

标签: django


【解决方案1】:

是的,只有在初始化模型元类时才会设置默认值,而不是在创建 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') 等标准语法。

【讨论】:

  • 我可以在它前面拍一个lambda: 让它可以调用,不是吗?
  • 是的,我发帖后就想到了:)
  • 顺便说一句,我很想使用 F() 实例作为默认值。我应该停止偷懒,去code.djangoproject.com填一张票……总有一天
  • 是否可以将参数传递给可调用对象?
  • @MarcoFrattallone 没有。最接近的方法是在闭包上定义模型。
猜你喜欢
  • 2016-02-12
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 2012-08-09
相关资源
最近更新 更多