如何强制Django模型中的2个字段共享相同的默认值?

时间:2016-06-13 04:59:25

标签: python django django-models default

我有一个Django模型MyModel,如下所示。

它有两个DateTimeField类型的字段:my_field1my_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

2 个答案:

答案 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