编辑:
如何将Django字段的默认设置为每次创建新模型对象时评估的函数?
我想做类似下面的事情,除了在这段代码中,代码被评估一次并将默认设置为创建的每个模型对象的相同日期,而不是每次创建模型对象时评估代码:
from datetime import datetime, timedelta
class MyModel(models.Model):
# default to 1 day from now
my_date = models.DateTimeField(default=datetime.now() + timedelta(days=1))
Run Code Online (Sandbox Code Playgroud)
原版的:
我想为函数参数创建一个默认值,使其成为动态的,并在每次调用函数时调用和设置.我怎样才能做到这一点?例如,
from datetime import datetime
def mydate(date=datetime.now()):
print date
mydate()
mydate() # prints the same thing as the previous call; but I want it to be a newer value
Run Code Online (Sandbox Code Playgroud)
具体来说,我想在Django中这样做,例如,
from datetime import datetime, timedelta
class MyModel(models.Model):
# default to 1 day from now
my_date = models.DateTimeField(default=datetime.now() + timedelta(days=1))
Run Code Online (Sandbox Code Playgroud) 尝试在Django模型中设置密钥到期的时间戳并遇到此问题:
我目前的代码:
key_expires = models.DateTimeField(default=timezone.now() + timezone.timedelta(days=1))
Run Code Online (Sandbox Code Playgroud)
上面的代码可行,但是当使用"timezone.now()"时,它会从Apache重新启动时获取时间戳,因此这不起作用.我做了一些研究,找到了问题的那一部分的解决方案,所以通过将"timezone.now()"替换为"timezone.now",每次创建对象时我都会获得当前时间戳,这是完美的,问题部分解决了.
我在使用"timezone.timedelta(days = 1)"更改日期时遇到问题.
key_expires = models.DateTimeField(default=timezone.now + timezone.timedelta(days=1))
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
key_expires = models.DateTimeField(default=timezone.now + timezone.timedelta(days=1))
Run Code Online (Sandbox Code Playgroud)
TypeError:+:'function'和'datetime.timedelta'不支持的操作数类型
目标是提前24小时设置时间戳.
任何帮助是极大的赞赏.
我需要做的是运行一个函数并在该函数返回的结果的开头附加一个前缀.每次为我的模型创建新实例时都需要执行此操作.
我试过的......
以下操作无效,因为您无法将字符串添加到函数中,并将ID设置为s_<function name etc>而不是函数的结果.
APP_PREFIX = "_s"
id = models.CharField(primary_key=True, max_length=50, unique=True,
default="{}{}".format(APP_PREFIX, make_id))
Run Code Online (Sandbox Code Playgroud)
也不会将前缀传递给函数,因为Django每次以这种方式调用函数时都会生成相同的键,不知道为什么:
id = models.CharField(primary_key=True, max_length=50, unique=True,
default=make_id(APP_PREFIX))
Run Code Online (Sandbox Code Playgroud)
这也不起作用:
id = models.CharField(primary_key=True, max_length=50, unique=True,
default=make_id + APP_PREFIX)
Run Code Online (Sandbox Code Playgroud)
或这个:
id = models.CharField(primary_key=True, max_length=50, unique=True,
default=make_id() + APP_PREFIX)
Run Code Online (Sandbox Code Playgroud)
怎么能实现这一目标?
我可以覆盖该save()方法并实现此目的,但必须有一种方法可以使用字段上的默认参数执行此操作!