在django中省略模型“保存”中的字段

时间:2010-10-26 12:04:37

标签: python django django-models

我有一个模型,它有几个“自动”字段,如下所示:

class Message(Model):
    subject = CharField(max_length = 200)
    message = TextField()
    created = DateTimeField()
    last_status_change = DateTimeField()
    status = CharField(max_length = 10)

在我的数据库(Postgres)中,我也设置了created, last_status_change, status的默认值,我设置了一个触发器,每次last_status_change更改时都会更新status

但是,当我尝试创建并保存这样的模型实例时:

m = Message(subject = 'Hello', message = 'Long and boring day')
m.save()

Django尝试在缺少的字段中插入NULL,这是错误的。有没有办法让它在没有这些字段的情况下发出插入,或者我是否必须在代码中复制我的数据库功能?

谢谢!

3 个答案:

答案 0 :(得分:1)

你可以尝试将空白设置为真。如下......

class Message(Model):
    subject = CharField(max_length = 200)
    message = TextField(blank=True,null=True)
    created = DateTimeField(auto_now=True)
    last_status_change = DateTimeField(auto_now=True)
    status = CharField(max_length = 10,blank=True,null=True)

    def save(self):
         self.last_status_change=Datetime.now()


答案 1 :(得分:0)

我建议您将默认值放入模型字段定义中,并实现更改状态的特殊方法或重写save()方法而不是数据库级触发器。

答案 2 :(得分:0)

您可以在更新时省略字段,但在插入时(按设计)。

如果你想将DateTime字段设置为日期(即datetime.now),你也可以将一个callable传递给默认参数,并自己设置utc时间(或任何你想要的):

ctime = models.DateTimeField(default=datetime.datetime.utcnow)

保存新行时,上面会自动插入当前日期和时间(utc)作为ctime字段值。

编辑:刚看到你也想要设置mtime,你可以确保你的代码完全按照自己的意愿运行,并避免使用pre_save signal hook进行额外更新:

from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel

@receiver(pre_save, sender=MyModel)
def update_mtime(sender, instance, **kwargs):
    instance.mtime = datetime.datetime.utcnow()