alv*_*vas 0 python django schema flask sql-update
onupdateDjango 的模型字段有参数吗?
例如,在带有 SQLAlchemy 的 Flask 中,可以使用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())
Run Code Online (Sandbox Code Playgroud)
从文档中,有一个auto_now参数,与onupdate=...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')
Run Code Online (Sandbox Code Playgroud)
如何“冻结”该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')
Run Code Online (Sandbox Code Playgroud)
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