在Django中保存模型时省略字段

1 投票
3 回答
738 浏览
提问于 2025-04-16 06:06

我有一个模型,这个模型里有几个“自动”的字段,像这样:

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 设置了默认值,并且我还设置了一个触发器,每次 status 变化时更新 last_status_change

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

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

Django 会尝试在那些缺失的字段中插入 NULL 值,这样是不对的。有没有办法让它在插入时不包含这些字段,还是说我必须在代码中重复我的数据库功能呢?

谢谢!

3 个回答

0

在更新数据时,你可以省略某些字段,但在插入数据时(这是设计使然)就不能这样做。

如果你想把日期时间字段设置为当前时间(比如使用 datetime.now),你也可以传递一个可调用的函数作为默认值,这样你就可以自己处理设置 UTC 时间(或者你想要的其他时间)了:

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

这样做的话,在保存新数据行时,ctime 字段的值会自动插入当前的日期和时间(UTC)。

补充说明:我刚看到你也想设置 mtime,你可以确保你的代码按照你想要的方式运行,并且避免额外的更新,使用一个 pre_save 信号钩子

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

我建议你在模型字段的定义中设置默认值,并实现一个专门的方法来改变状态,或者重写save()方法,而不是使用数据库级别的触发器。

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


撰写回答