【问题标题】:Automatically changing Django model field on update for one field and freezing one-time write-only for another?更新一个字段时自动更改Django模型字段并冻结另一个字段的一次性只写?
【发布时间】:2016-10-09 12:38:11
【问题描述】:

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

例如,在带有 SQLAlchemy 的 Flask 中,可以对数据库架构的 db.Column() 使用 onupdate=... 参数执行以下操作:

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()中的onupdate=...参数是一样的吗

我尝试了以下模型对象来模拟上面的 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 会自动更新?

【问题讨论】:

  • 在解决您的问题的实质之前,您的所有示例都是错误的,因为您传递的是调用函数 (now()) 而不是函数本身 (now) 的结果。让我们知道这不是您问题的根源。
  • 感谢凯文注意到这一点!不,这不是问题的根源。看起来重复问题的帖子可能是相关的。

标签: python django flask sql-update schema


【解决方案1】:

在 django 中,models.DateTimeFieldauto_now_addauto_now 可选参数

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/#datetimefieldhttps://docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.DateField 的文档

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 2020-08-08
    • 1970-01-01
    • 2014-05-06
    • 2017-02-02
    • 2019-11-18
    • 1970-01-01
    相关资源
    最近更新 更多