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

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会自动更新?

A. *_*arr 5

在 Django 中,您有auto_now_addauto_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/#datetimefieldhttps://docs.djangoproject.com/en/1.9/ref/models/fields/#文档中的更多信息django.db.models.DateField