为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

撒科打诨 2019-12-25 10:22:44
编辑:如何将Django字段的默认值设置为每次创建新模型对象时都会求值的函数?我想执行以下操作,除了在此代码中,该代码被评估一次,并为每个创建的模型对象将默认值设置为相同的日期,而不是在每次创建模型对象时都对代码进行评估:from datetime import datetime, timedeltaclass MyModel(models.Model):  # default to 1 day from now  my_date = models.DateTimeField(default=datetime.now() + timedelta(days=1))原版的:我想为函数参数创建一个默认值,使它是动态的,并在每次调用函数时被调用和设置。我怎样才能做到这一点?例如,from datetime import datetimedef mydate(date=datetime.now()):  print datemydate() mydate() # prints the same thing as the previous call; but I want it to be a newer value具体来说,我想在Django中进行操作,例如,from datetime import datetime, timedeltaclass MyModel(models.Model):  # default to 1 day from now  my_date = models.DateTimeField(default=datetime.now() + timedelta(days=1))
查看完整描述

3 回答

?
达令说

TA贡献1821条经验 获得超6个赞

这个问题被误导了。在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 1.7之前的版本


Django 允许您将callable作为默认值传递,并且每次都会调用它,如您所愿:


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用作默认值(请参阅@stvnw注释)。正确的方法是在字段之前声明一个函数,并将其用作可调用的default_value中的arg:


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)


查看完整回答
反对 回复 2019-12-25
  • 3 回答
  • 0 关注
  • 1438 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信