当前位置: 首页 > news >正文

django的model中定义【记录修改次数】的这个字段该用什么类型

在这里插入图片描述
django中定义对于某个文章应用的数据库中使用到记录修改次数的这个字段

如models.py中的配置

from django.db import models
from django.utils import timezone
from django.contrib.postgres.fields import ArrayFieldclass Article(models.Model):# Titlestitle_cn = models.CharField(max_length=255, verbose_name='中文标题')title_en = models.CharField(max_length=255, blank=True, null=True, verbose_name='英文标题')# Summariessummary_cn = models.TextField(verbose_name='文章概括中文')summary_en = models.TextField(blank=True, null=True, verbose_name='文章概括英文')# Contentcontent_cn = models.TextField(verbose_name='文章富文本--中文')content_en = models.TextField(blank=True, null=True, verbose_name='文章富文本--英文')# Recommended Products (Repeat 5 times)for i in range(1, 6):locals()[f'product_{i}'] = models.BooleanField(default=False, verbose_name=f'推荐商品{i}【有或无】')locals()[f'product_{i}_title_cn'] = models.CharField(max_length=255, blank=True, null=True, verbose_name=f'推荐商品{i}标题--中文')locals()[f'product_{i}_title_en'] = models.CharField(max_length=255, blank=True, null=True, verbose_name=f'推荐商品{i}标题--英文')locals()[f'product_{i}_summary_cn'] = models.TextField(blank=True, null=True, verbose_name=f'推荐商品{i}商品大致概括--中文')locals()[f'product_{i}_summary_en'] = models.TextField(blank=True, null=True, verbose_name=f'推荐商品{i}商品大致概括--英文')locals()[f'product_{i}_link_cn'] = models.URLField(blank=True, null=True, verbose_name=f'推荐商品{i}的链接--中文')locals()[f'product_{i}_link_en'] = models.URLField(blank=True, null=True, verbose_name=f'推荐商品{i}的链接--英文')# Timestampscreated_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')updated_at = models.DateTimeField(auto_now=True, verbose_name='最后修改时间')change_count = models.PositiveIntegerField(default=0, verbose_name='更改次数')# Modification Timesmodification_times = ArrayField(models.DateTimeField(), blank=True, default=list, verbose_name='修改时间')class Meta:verbose_name = '文章'verbose_name_plural = '文章'def __str__(self):return self.title_cndef save(self, *args, **kwargs):if self.pk:self.change_count += 1self.modification_times.append(timezone.now())super().save(*args, **kwargs)

这里面的

modification_times = ArrayField(models.DateTimeField(), blank=True, default=list, verbose_name='修改时间')

Django 的 ArrayField 是为 PostgreSQL 构建的。

SQLite 没有 ArrayField 这个字段类型。

当我还是在测试时,我希望使用SQLite数据库。

要在 SQLite 中存储修改时间列表,一种不同的方法。

我们可以使用文本字段将修改时间存储为序列化的 JSON 列表。

修改时间(存储为 JSON):

models.py模型中的配置

from django.db import models
from django.utils import timezone
import jsonclass Article(models.Model):# Titlestitle_cn = models.CharField(max_length=255, verbose_name='中文标题')title_en = models.CharField(max_length=255, blank=True, null=True, verbose_name='英文标题')# Summariessummary_cn = models.TextField(verbose_name='文章概括中文')summary_en = models.TextField(blank=True, null=True, verbose_name='文章概括英文')# Contentcontent_cn = models.TextField(verbose_name='文章富文本--中文')content_en = models.TextField(blank=True, null=True, verbose_name='文章富文本--英文')# Recommended Products (Repeat 5 times)for i in range(1, 6):locals()[f'product_{i}'] = models.BooleanField(default=False, verbose_name=f'推荐商品{i}【有或无】')locals()[f'product_{i}_title_cn'] = models.CharField(max_length=255, blank=True, null=True, verbose_name=f'推荐商品{i}标题--中文')locals()[f'product_{i}_title_en'] = models.CharField(max_length=255, blank=True, null=True, verbose_name=f'推荐商品{i}标题--英文')locals()[f'product_{i}_summary_cn'] = models.TextField(blank=True, null=True, verbose_name=f'推荐商品{i}商品大致概括--中文')locals()[f'product_{i}_summary_en'] = models.TextField(blank=True, null=True, verbose_name=f'推荐商品{i}商品大致概括--英文')locals()[f'product_{i}_link_cn'] = models.URLField(blank=True, null=True, verbose_name=f'推荐商品{i}的链接--中文')locals()[f'product_{i}_link_en'] = models.URLField(blank=True, null=True, verbose_name=f'推荐商品{i}的链接--英文')# Timestampscreated_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')updated_at = models.DateTimeField(auto_now=True, verbose_name='最后修改时间')change_count = models.PositiveIntegerField(default=0, verbose_name='更改次数')# Modification Times (stored as a JSON list)modification_times = models.TextField(default='[]', verbose_name='修改时间')class Meta:verbose_name = '文章'verbose_name_plural = '文章'def __str__(self):return self.title_cndef save(self, *args, **kwargs):if self.pk:self.change_count += 1mod_times = json.loads(self.modification_times)mod_times.append(timezone.now().isoformat())self.modification_times = json.dumps(mod_times)super().save(*args, **kwargs)def get_modification_times(self):return json.loads(self.modification_times)

注解:

    # Modification Times (stored as a JSON list)modification_times = models.TextField(default='[]', verbose_name='修改时间')def get_modification_times(self):return json.loads(self.modification_times)

modification_times:是 TextField类型,用于将修改时间存储为序列化的 JSON 列表。

get_modification_times:用于将 JSON 列表解析回 Python 列表的帮助程序方法。
通过附加序列化为 JSON 字符串的当前时间来更新 modification_times 字段。

模型的admin.py

# from django.contrib import admin# Register your models here.
from django.contrib import admin
from .models import Articleclass ArticleAdmin(admin.ModelAdmin):list_display = ('title_cn', 'title_en', 'summary_cn', 'summary_en', 'has_recommended_products', 'created_at', 'updated_at', 'change_count')search_fields = ('title_cn', 'title_en')# Define fieldsets to organize form layoutfieldsets = (('标题', {'fields': (('title_cn', 'title_en'),)}),('概括', {'fields': (('summary_cn', 'summary_en'),)}),('内容', {'fields': (('content_cn', 'content_en'),)}),('推荐商品1', {'fields': ('product_1', 'product_1_title_cn', 'product_1_title_en', 'product_1_summary_cn', 'product_1_summary_en', 'product_1_link_cn', 'product_1_link_en')}),('推荐商品2', {'fields': ('product_2', 'product_2_title_cn', 'product_2_title_en', 'product_2_summary_cn', 'product_2_summary_en', 'product_2_link_cn', 'product_2_link_en')}),('推荐商品3', {'fields': ('product_3', 'product_3_title_cn', 'product_3_title_en', 'product_3_summary_cn', 'product_3_summary_en', 'product_3_link_cn', 'product_3_link_en')}),('推荐商品4', {'fields': ('product_4', 'product_4_title_cn', 'product_4_title_en', 'product_4_summary_cn', 'product_4_summary_en', 'product_4_link_cn', 'product_4_link_en')}),('推荐商品5', {'fields': ('product_5', 'product_5_title_cn', 'product_5_title_en', 'product_5_summary_cn', 'product_5_summary_en', 'product_5_link_cn', 'product_5_link_en')}),('时间信息', {'fields': ('created_at', 'updated_at', 'change_count', 'modification_times')}),)readonly_fields = ('created_at', 'updated_at', 'change_count', 'modification_times')def has_recommended_products(self, obj):return any([getattr(obj, f'product_{i}') for i in range(1, 6)])has_recommended_products.boolean = Truehas_recommended_products.short_description = '有推荐商品'# Register the Article model with the ArticleAdmin configuration
admin.site.register(Article, ArticleAdmin)

相关文章:

django的model中定义【记录修改次数】的这个字段该用什么类型

django中定义对于某个文章应用的数据库中使用到记录修改次数的这个字段 如models.py中的配置 from django.db import models from django.utils import timezone from django.contrib.postgres.fields import ArrayFieldclass Article(models.Model):# Titlestitle_cn model…...

windows openssl编译x64版libssl.lib,编译x64版本libcurl.lib,支持https,vs2015编译器

不要纠结,直接选择用perl编译! 告诫想要用弄成vs编译版的,暂时先别给自己增加麻烦 告诫,以下执行的每一步,都不要纠结 先安装环境 nasm 64位版本 https://www.nasm.us/pub/nasm/releasebuilds/2.16.01/win64/nasm-…...

搭建 Elasticsearch 集群:完整教程

本文将详细介绍如何在 Linux 环境下搭建一个 Elasticsearch 集群,涵盖环境准备、配置优化、服务启动等多个环节。 一、环境准备 创建安装目录 mkdir /es cd /es解压 Elasticsearch 安装包 tar -xzf elasticsearch-7.10.1-linux-x86_64.tar.gz -C /es配置环境变量 编…...

如何实现序列化和反序列化?如何处理对象的生命周期管理?

序列化和反序列化 实现思路: 序列化:将对象的状态信息转换为可以存储或传输的格式,通常是字节流。 确定要序列化的对象的数据成员。将这些数据成员按照一定的规则(如二进制、文本、JSON、XML 等)编码为字节序列。将生…...

WPF+MVVM案例实战与特效(三十八)- 封装一个自定义的数字滚动显示控件

文章目录 1、运行效果2、案例实现1、功能设计2、页面布局3、控件使用4、运行效果3、拓展:多数字自定义控件1、控件应用4、总结1、运行效果 在Windows Presentation Foundation (WPF)应用程序中,自定义控件允许开发者创建具有特定功能和外观的独特UI元素。本博客将介绍一个名…...

docker安装Redis、docker使用Redis、docker离线安装redis、Redis离线安装

服务器到期了,换了一个新的环境要重搭,就记录一下好了: -----docker在线安装Redis 拉取 Redis 镜像 docker pull redis:6.2 运行 Redis 容器 docker run --name redis -d redis docker run --name redis -d redis:6.2 映射端口 docker run -…...

单目动态新视角合成

目录 单目动态新视角合成 Generative Camera Dolly:Extreme Monocular Dynamic Novel View Synthesis 单目动态新视角合成 Generative Camera Dolly: Extreme Monocular Dynamic Novel View Synthesis Generative Camera Dolly: Extreme Monocular Dynamic Novel View Synth…...

STM32--IO引脚复用

IO引脚复用...

Python字符串及正则表达式(十):字符串常用操作、字符串编码转换

前言:在编程的世界里,字符串无处不在。它们是构建用户界面、存储数据、进行通信的基础元素。无论是财务系统的总账报表、电子游戏的比赛结果,还是火车站的列车时刻表,这些信息最终都需要以文本的形式呈现给用户。这些文本的背后&a…...

前端的Python入门指南(完):错误和异常处理策略及最佳实践

《前端的 Python 入门指南》系列文章: (一):常用语法和关键字对比(二):函数的定义、参数、作用域对比(三):数据类型对比 - 彻底的一切皆对象实现和包装对象异…...

LeetCode 2475 数组中不等三元组的数目

问题描述: 给定一个下标从 0 开始的正整数数组 nums&#xff0c;我们的目标是找出并统计满足下述条件的三元组 (i, j, k) 的数目&#xff1a; 0 < i < j < k < nums.length&#xff0c;这确保了三元组索引的顺序性。nums[i]、nums[j] 和 nums[k] 两…...

【和春笋一起学C++】字符串比较

目录 C语言字符串比较 C语言字符比较 C字符串比较 C语言字符串比较 在C语言中用于比较字符串的函数为strcmp函数&#xff0c;该函数定义在头文件<string.h>中&#xff0c;是一个标准库函数。strcmp函数的工作原理是逐字符比较两个字符串&#xff0c;直到找到不同的字符…...

HTTP 协议报文结构 | 返回状态码详解

注&#xff1a;本文为 “HTTP 历史 | 协议报文结构 | 返回状态码” 相关文章合辑。 未整理去重。 HTTP 历史 wangjunliang 最后更新: 2024/3/16 上午10:29 超文本传输协议(英语:HyperTextTransferProtocol,缩写:HTTP)是 万维网(World Wide Web)的基础协议&#xff61;自 蒂姆…...

.net winform 实现CSS3.0 泼墨画效果

效果图 代码 private unsafe void BlendImages1(Bitmap img1, Bitmap img2) {// 确定两个图像的重叠区域Rectangle rect new Rectangle(0, 0,Math.Min(img1.Width, img2.Width),Math.Min(img1.Height, img2.Height));// 创建输出图像&#xff0c;尺寸为重叠区域大小Bitmap b…...

LearnOpenGL学习(高级OpenGL - - 实例化,抗锯齿)

实例化 对于在同一场景中使用相同顶点数据的对象&#xff08;如草地中的草&#xff09;&#xff0c;可以使用实例化&#xff08;Instancing&#xff09;技术&#xff0c;用一个绘制函数让OpenGL绘制多个物体&#xff0c;而非循环&#xff08;Drawcall: N->1&#xff09;。 …...

大数据与AI:从分析到预测的跃迁

引言&#xff1a;数据时代的新纪元 从每天的社交分享到企业的运营决策&#xff0c;数据早已成为现代社会不可或缺的资源。我们正置身于一个数据爆炸的时代&#xff0c;数以亿计的信息流实时生成&#xff0c;为人类带来了前所未有的洞察能力。然而&#xff0c;数据的价值并不仅限…...

【CC2530开发基础篇】继电器模块使用

一、前言 1.1 开发背景 本实验通过使用CC2530单片机控制继电器的吸合与断开&#xff0c;深入了解单片机GPIO的配置与应用。继电器作为一种常见的电气控制元件&#xff0c;广泛用于自动化系统中&#xff0c;用于控制大功率负载的开关操作。在本实验中&#xff0c;将通过GPIO口…...

C05S07-Tomcat服务架设

一、Tomcat 1. Tomcat概述 Tomcat也是一个Web应用程序&#xff0c;具有三大核心功能。 Java Servlet&#xff1a;Tomcat是一个Servlet容器&#xff0c;负责管理和执行Java Servlet、服务端的Java程序&#xff0c;处理客户端的HTTP请求和响应。Java Server&#xff1a;服务端…...

Java stream groupingBy sorted 实现多条件排序与分组的最佳实践

1. 数据初始化 这一部分代码用于创建 Product 对象并将它们添加到 result 列表中。 // 初始化数据 List<Product> result new ArrayList<>(); List<Product> resp new ArrayList<>();// 添加产品数据 result.add(new Product("手机A", 1…...

JAVA:代理模式(Proxy Pattern)的技术指南

1、简述 代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理,以控制对这个对象的访问。通过代理模式,我们可以在不修改目标对象代码的情况下扩展功能,满足特定的需求。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...