我有一个Django模型MyModel
,如下所示。
它有两个DateTimeField类型的字段:my_field1
,my_field2
from django.db import models
from datetime import datetime
class MyModel(models.Model):
my_field1 = models.DateTimeField(default=datetime.utcnow, editable=False)
my_field2 = models.DateTimeField(
# WHAT DO I PUT HERE?
)
我希望这两个字段默认为datetime.utcnow()
的值。但我想为两者保存 相同的 值。点击utcnow()
两次似乎很浪费。
如何设置my_field2
的默认值,以便只复制默认值my_field1
?
答案 0 :(得分:1)
执行此操作的正确方法是使用save方法而不是__init__
方法。实际上不建议过度使用 init 方法,如果你想控制对象的读取方式,或者如果你想控制它们的保存方法,更好的方法是过度使用from_db。
class MyModel(models.Model):
my_field1 = models.DateTimeField(default=datetime.utcnow, editable=False)
my_field2 = models.DateTimeField()
def save(self, *arges, **kwargs):
if self.my_field1 is None:
self.my_field1 = datetime.utcnow()
if self.my_field2 is None:
self.my_field2 = self.my_field1
super(MyModel, self).save(*args, **kwargs)
更新:我的声明的参考:https://docs.djangoproject.com/en/1.9/ref/models/instances/
您可能想通过覆盖 init 来自定义模型 方法。但是,如果这样做,请注意不要更改呼叫 签名,因为任何更改都可能阻止模型实例 保存。而不是覆盖 init ,尝试使用其中之一 接近:
答案 1 :(得分:0)
如docs中所述:
创建新模型实例时,将使用默认值,并且不为该字段提供值。
因此,为了解决您的任务,我会在__init__
中手动填写默认值。类似的东西:
def __init__(self, *args, **kwargs):
now = datetime.datetime.utcnow()
kwargs.setdefault('my_field1', now)
kwargs.setdefault('my_field2', now)
super(MyModel, self).__init__(*args, **kwargs)
或者,您可以使用save
方法处理值。
如果您希望my_field2
拥有my_field1
中的任何值,我会选择此解决方案:
class MyModel(models.Model):
my_field1 = models.DateTimeField(default=datetime.utcnow, editable=False)
my_field2 = models.DateTimeField()
def __init__(self, **kwargs):
super(MyModel, self).__init__(**kwargs)
if self.my_field2 is None:
self.my_field2 = self.my_field1