当前位置: 首页 > 面试题库 >

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

傅穆冉
2023-03-14
问题内容

编辑:

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

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

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注释)。正确的方法是在字段之前声明一个函数,并将其用作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答案



 类似资料:
  • 问题内容: 我的模特: 我想同时保存并保存在该模型中: 我知道这是错误的,但是我敢肯定,你会明白我的意思。你会怎么做? 问题答案: 你不能从未保存的对象创建m2m关系。如果有pk,请尝试以下操作: 更新:阅读了saverio的答案后,我决定对这个问题进行更深入的研究。这是我的发现。 这是我最初的建议。它可以工作,但不是最佳选择。(注意:我使用的是和而不是s和,但你明白了。) 它总共产生7个查询:

  • 本文向大家介绍django 模型字段设置默认值代码,包括了django 模型字段设置默认值代码的使用技巧和注意事项,需要的朋友参考一下 我就废话不多说了,大家还是直接看代码吧~ 补充知识:django 设置默认值到SQL 环境:django 1.9.7 背景介绍 django migrate 生成表结构时,默认是不处理default(即字段的default 是在django 框架层面,没有到数据库

  • 问题内容: 假设我有一个模型: 目前,我正在使用默认的admin创建/编辑此类型的对象。如何从管理员中删除该字段,以使每个对象都无法使用值创建,而是将接收默认值? 问题答案: 设置为和为默认值。 http://docs.djangoproject.com/en/dev/ref/models/fields/#editable 另外,你的字段是不必要的。Django将自动添加它。

  • 问题内容: 我有一个模型,希望包含一个主题名称及其首字母。(数据在某种程度上是匿名的,并且通过缩写来跟踪。) 现在,我写了 如最后一行所示,我希望能够将姓名的首字母实际作为字段(与名称无关)存储在数据库中,但是会使用基于名称字段的默认值进行初始化。但是,我遇到了问题,因为Django模型似乎没有“自我”。 如果将行更改为,则可以执行syncdb,但不能创建新主题。 在django中,有一个可调用函

  • 我有一个自定义的对象FlightRequest的机会对象,有一个金额提交的机会和FlightRequest。 我想在FlightRequest的Amount字段中将机会的金额提交值设置为默认值。因此,每当单击FlightRequest的新按钮时,金额输入应该已经与机会的金额字段一起输入 我使用的是标准页面布局,没有任何视觉力页面布局,不能使用它。 我看到有一个选项可以设置字段的默认值,但Oppor

  • 如何知道django模型的一个实例何时在sqlite中创建了?我尝试了许多方法,但是我不知道或不知道我的数据库实例是何时创建的 从datetime导入datetime,time delta time _ threshold = datetime . now()-time delta(hours = 4)results = x . objects . filter(created _ _ lt =