如何将 Django 模型字段的默认值设置为函数调用/可调用(例如,相对于模型对象创建时间的日期) [英] How to set a Django model field's default value to a function call / callable (e.g., a date relative to the time of model object creation)

查看:65
本文介绍了如何将 Django 模型字段的默认值设置为函数调用/可调用(例如,相对于模型对象创建时间的日期)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何将 Django 字段的默认值设置为每次创建新模型对象时评估的函数?

How can I set a Django field's default to a function that gets evaluated each time a new model object gets created?

我想做以下类似的事情,除了在这段代码中,代码被评估一次并将默认值设置为每个创建的模型对象的相同日期,而不是每次创建模型对象时评估代码:

I want to do something like the following, except that in this code, the code gets evaluated once and sets the default to the same date for each model object created, rather than evaluating the code each time a model object gets created:

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))



原文:

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

I want to create a default value for a function parameter such that it is dynamic and gets called and set each time the function is called. How can I do that? e.g.,

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 中做到这一点,例如,

Specifically, I want to do it in Django, e.g.,

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 中创建模型字段时,您并没有定义函数,因此函数默认值无关紧要:

The question is misguided. When creating a model field in Django, you are not defining a function, so function default values are irrelevant:

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))

最后一行不是定义函数;它正在调用一个函数来在类中创建一个字段.

This last line is not defining a function; it is invoking a function to create a field in the class.

PRE Django 1.7

Django 让你传递一个可调用作为默认值,并且每次都会调用它,就像您想要的那样:

Django lets you pass a callable as the default, and it will invoke it each time, just as you want:

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 评论).执行此操作的正确方法是在字段之前声明一个函数,并将其用作名为 arg 的 default_value 中的可调用对象:

Please note that since Django 1.7, usage of lambda as default value is not recommended (c.f. @stvnw comment). The proper way to do this is to declare a function before the field and use it as a callable in default_value named 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)

下面@simanas 回答中的更多信息

More information in the @simanas answer below

这篇关于如何将 Django 模型字段的默认值设置为函数调用/可调用(例如,相对于模型对象创建时间的日期)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆