在一个字段的更新时自动更改Django模型字段并为另一个字段冻结一次性只写?

时间:2016-06-09 03:05:32

标签: python django flask sql-update schema

Django的模型字段是否有onupdate参数?

例如,在使用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())

docs开始,有一个auto_now参数,与SQLAlchemy的onupdate=...

中的db.Column()参数相同

我尝试过以下模型对象来模拟上面的Flask代码,但是如何才能在Django中获得相同的onupdate=...“效果”?

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,每当我更改用户的值时,它都会更改,例如如果我创建了一个用户并保存,然后更改namecreated_on应保持不变,但updated_on会自动更新?

1 个答案:

答案 0 :(得分:3)

在django中,您有auto_now_add的{​​{1}}和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将字段设置为创建或更新对象时的当前时间。你应该知道一些古怪的行为:

  

该字段仅在调用Model.save()时自动更新。使用其他方式(如QuerySet.update())更新其他字段时,不会更新该字段,但您可以在更新中为该字段指定自定义值。

https://docs.djangoproject.com/en/1.9/ref/models/fields/#datetimefieldhttps://docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.DateField

文档中的更多信息
相关问题