自动更改一个字段的更新时的Django模型字段并冻结一次性写入另一个字段?
Django模型字段是否有onupdate
参数?自动更改一个字段的更新时的Django模型字段并冻结一次性写入另一个字段?
例如,在烧瓶SQLAlchemy的,它可能像做与onupdate=...
参数以下db.Column()
数据库模式的:
import datetime
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
created_on = db.Column(db.Text, default=datetime.datetime.utcnow().isoformat())
updated_on = db.Column(db.Text, default=datetime.datetime.utcnow().isoformat(),
onupdate=datetime.datetime.utcnow().isoformat())
从docs,有一个auto_now
参数,就是SQLAlchemy的db.Column()
我试过以下模型对象来模拟上面的Flask代码,但我怎么能得到相同的onupdate=...
在Django中的“效果”?
from django.db import models
from django.utils.timezone import now
class User(models.Model):
id = models.IntegerField()
created_on = models.DateTimeField(default=now)
updated_on = models.DateTimeField(default=now)
name = models.CharField(default='blah blah')
如何“冻结”,使其只能被添加一次,并永远不会再后来改变为create_on
字段的值?
但是,对于updated_on
,每当我改变用户的值时,它就会改变。如果我创建了一个用户并保存,则之后更改name
,created_on
应保持不变,但updated_on
会自动更新?
在Django你有auto_now_add
和auto_now
可选参数为models.DateTimeField
class User(models.Model):
id = models.IntegerField()
created_on = models.DateTimeField(auto_now_add=True)
updated_on = models.DateTimeField(auto_now=True)
name = models.CharField(default='blah blah')
auto_now_add
将字段设置为当前时间创建一个对象,并auto_now
会现场,当一个对象设置为当前时间被创建或更新。您应该了解一些古怪的行为:
该字段仅在调用Model.save()时自动更新。在以其他方式更新其他字段(如QuerySet.update())时,字段不会更新,但您可以在更新中为字段指定自定义值。在https://docs.djangoproject.com/en/1.9/ref/models/fields/#datetimefield和https://docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.DateField在文档
更多信息
的[Django的Django的不具有自动时间戳创建/更新场像CakePHP的?(可能的复制http://stackoverflow.com/questions/10979488/ django-do-django-have-an-automatic-timestamp-create-update-field-like-cakephp) – dirn
在解决问题的实质之前,所有的例子都是错误的,因为你传递了调用函数的结果('now()')而不是函数本身('now')。让我们知道这不是问题的根源。 –
感谢Kevin注意到这一点!不,这不是问题的根源。看起来像重复问题的帖子可能是相关的。 – alvas