gpt4 book ai didi

django - 如何将 Django 模型字段的默认值设置为函数调用/可调用(例如,相对于模型对象创建时间的日期)

转载 作者:行者123 更新时间:2023-11-28 19:32:49 25 4
gpt4 key购买 nike

已编辑:

如何将 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))



原创:

我想为函数参数创建一个默认值,这样它是动态的,每次调用函数时都会被调用和设置。我怎样才能做到这一点?例如,

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

具体来说,我想在 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))

最佳答案

这个问题被误导了。在 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))

最后一行没有定义函数;它正在调用一个函数来在类中创建一个字段。

在这种情况下,datetime.now() + timedelta(days=1) 将被评估一次,并存储为默认值。

PRE Django 1.7

Django [允许您将可调用对象作为默认值传递][1],并且每次都会调用它,就像您想要的那样:

from datetime import datetime, timedelta
class MyModel(models.Model):
# default to 1 day from now
my_date = models.DateTimeField(default=lambda: datetime.now() + timedelta(days=1))

Django 1.7+

请注意,从 Django 1.7 开始,不推荐使用 lambda 作为默认值(c.f. @stvnw 评论)。正确的方法是在字段之前声明一个函数,并将其用作名为 arg 的 default_value 中的可调用函数:

from datetime import datetime, timedelta

# default to 1 day from now
def get_default_my_date():
return datetime.now() + timedelta(days=1)

class MyModel(models.Model):
my_date = models.DateTimeField(default=get_default_my_date)

更多信息在下面的@simanas 回答中[1]: https://docs.djangoproject.com/en/dev/ref/models/fields/#default

关于django - 如何将 Django 模型字段的默认值设置为函数调用/可调用(例如,相对于模型对象创建时间的日期),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12649659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com