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

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

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

如models.py中的配置

from django.db import models
from django.utils import timezone
from django.contrib.postgres.fields import ArrayField

class Article(models.Model):
    # Titles
    title_cn = models.CharField(max_length=255, verbose_name='中文标题')
    title_en = models.CharField(max_length=255, blank=True, null=True, verbose_name='英文标题')
    
    # Summaries
    summary_cn = models.TextField(verbose_name='文章概括中文')
    summary_en = models.TextField(blank=True, null=True, verbose_name='文章概括英文')
    
    # Content
    content_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}的链接--英文')

    # Timestamps
    created_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
    modification_times = ArrayField(models.DateTimeField(), blank=True, default=list, verbose_name='修改时间')

    class Meta:
        verbose_name = '文章'
        verbose_name_plural = '文章'

    def __str__(self):
        return self.title_cn



    def save(self, *args, **kwargs):
        if self.pk:
            self.change_count += 1
            self.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 json

class Article(models.Model):
    # Titles
    title_cn = models.CharField(max_length=255, verbose_name='中文标题')
    title_en = models.CharField(max_length=255, blank=True, null=True, verbose_name='英文标题')
    
    # Summaries
    summary_cn = models.TextField(verbose_name='文章概括中文')
    summary_en = models.TextField(blank=True, null=True, verbose_name='文章概括英文')
    
    # Content
    content_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}的链接--英文')

    # Timestamps
    created_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_cn

    def save(self, *args, **kwargs):
        if self.pk:
            self.change_count += 1
            mod_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 Article

class 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 layout
    fieldsets = (
        ('标题', {
            '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 = True
    has_recommended_products.short_description = '有推荐商品'

# Register the Article model with the ArticleAdmin configuration
admin.site.register(Article, ArticleAdmin)


http://www.kler.cn/a/445323.html

相关文章:

  • 谷歌建筑下载
  • Clickhouse(Centos)
  • linux zip unzip 命令的使用
  • PostgreSQL技术内幕21:SysLogger日志收集器的工作原理
  • 前端小白学习之路-Vben探索 vite 配置 - 1/50
  • 使用k6进行MongoDB负载测试
  • WEB开发: Node.js路由之由浅入深- 即拿即用完整版
  • 12种Vue设计模式
  • 梳理Nginx 的七大应用场景
  • Gin-vue-admin(2):项目创建前端一级页面和二级页面
  • Hadoop、Hbase使用Snappy压缩
  • 十二月第14讲:使用Python实现两组数据纵向排序
  • Go语言启动独立进程
  • DeepSeek-V2的多头潜在注意力机制及其在开源Mixture-of-Experts (MoE)语言模型中的应用
  • 【c++】自定义头文件与CMakeLists.txt添加
  • django 中在admin.py中的管理后台中需要挂载js脚本
  • 707. 设计链表 链表的知识复习
  • 【前端面试】三次握手/http/https,是否跳转携带cookie,跨域
  • C 语言: sizeof 运算符深度解析
  • 【PGCCC】Postgresql Varlena 结构
  • bicycle 和cycle区别及使用场景
  • 线上虚拟展厅支持哪些类型的素材添加?
  • 农村的PCDN
  • Mysql语法之DQL查询的多行函数
  • 电子应用设计方案-62:智能鞋柜系统方案设计
  • ChromeOS 131 版本更新