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

embedded/2024/12/21 16:45:17/

在这里插入图片描述
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)

http://www.ppmy.cn/embedded/147572.html

相关文章

高性能KPC354x国产光电耦合器:适用于现代应用

KPC354x国产光电耦合器是一种多功能高效组件,旨在为复杂的电子系统提供可靠的电气隔离和信号传输。其坚固的设计加上高性能规格使其成为从工业自动化到通信系统和消费电子产品等应用的重要组成部分。通过提供耐用性、适应性和环境合规性的平衡,KPC354x脱…

Moretl开箱即用日志采集

永久免费: 至Gitee下载 使用教程: Moretl使用说明 使用咨询: 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架…

数据结构之旅:红黑树如何驱动 Set 和 Map

一、红黑树 1、定义 红黑树是一种二叉搜索树,在每个节点上增加一个存储位表示结点的颜色(红色或者黑色)。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保不会有一条路径比其他路径长出两倍,因而这种树是一种接近平衡的…

阻塞队列与线程池原理

1、阻塞队列 阻塞队列:当队列已满的时候,向队列中添加元素的操作会被阻塞;当队列为空的时候,从队列中取元素的操作会被阻塞。 Java 中用 BlockingQueue 接口表示阻塞队列。BlockingQueue 接口作为 Queue 的子接口,主…

软件测试工程师面试整理 —— 编程与自动化!

在软件测试领域,编程与自动化是提升测试效率、覆盖率和可靠性的关键因素。掌握编程技术和自动化测试框架,能够帮助测试人员有效地执行大量重复性测试任务,并迅速反馈软件的质量状况。以下是编程与自动化在测试中的主要应用及相关技术介绍&…

网络直播带货查询系统设计与实现:SSM + JAVA 核心架构与 JSP 支撑

第四章 系统设计 4.1 系统体系结构 网络直播带货网站的结构图4-1所示: 图4-1 系统结构 模块包括主界面,主页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理等进行相应的操作。 登录系统结构图,如图4-2所示&#xf…

Springboot整合ElasticSearch实现搜索功能

一、导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>7.12.1</version> </dependency> <dependency><groupId>org.…

[前端]mac安装nvm(node.js)多版本管理

一、下载nvm https://github.com/nvm-sh/nvm/releases/tag/v0.40.1 二、安装nvm 解压后 ./install.sh nvm -v 0.40.1安装后&#xff0c;验证一下版本&#xff0c;搞定&#xff01; 接下来开始安装node.js 三、安装node.js 1、查看一下有哪些版本可以安装&#…