You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django ORM中保存数据时自动生成并插入chunk_title字段值

解决Django模型自动生成chunk_title_book字段值的问题

完全可以实现你的需求,下面是两种常用的落地方案:

方法一:重写模型的save()方法

这是最直接的实现方式,在保存模型实例前自动计算并赋值目标字段。

修改你的Book模型,重写save方法:

import textwrap
from django.db import models

class Book(models.Model):
    """
    存储站点所有书籍的类
    """
    title = models.CharField(max_length=120, default=' ', verbose_name='Назва')
    description = models.TextField(verbose_name='Опис')
    category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name='Категорія')
    date_at = models.DateField(auto_now_add=True, verbose_name='Дата створення')
    image = models.ImageField(upload_to='photos/%Y/%m/%d/')
    authors = models.ManyToManyField(Author, verbose_name='Автори')
    content = models.FileField(upload_to='contents/%Y/%m/%d/', blank=True)
    price = models.IntegerField(verbose_name='Ціна', default='0')
    chunk_title_book = models.TextField(default=' ')

    def chunk_title(self, string: str) -> str:
        """
        将书籍标题拆分为最多3字符的片段,用于后续按片段搜索
        """
        chunk_string = ' '.join(textwrap.wrap(string, 3))
        return chunk_string + ' ' + ' '.join(string.split())

    def save(self, *args, **kwargs):
        # 保存前自动计算并赋值chunk_title_book
        self.chunk_title_book = self.chunk_title(self.title)
        super().save(*args, **kwargs)

此后无论创建新的Book实例,还是更新已有实例的title字段,save方法都会自动调用chunk_title处理标题,将结果存入chunk_title_book。

方法二:使用Django信号(Signal)

如果不想修改模型的save方法,可以用Django的pre_save信号,在模型保存前触发字段赋值逻辑。

  1. 在你的应用目录下新建signals.py文件,添加以下内容:
import textwrap
from django.db.models.signals import pre_save
from django.dispatch import receiver
from .models import Book

@receiver(pre_save, sender=Book)
def update_chunk_title(sender, instance, **kwargs):
    # 计算处理后的标题片段并赋值
    chunk_string = ' '.join(textwrap.wrap(instance.title, 3))
    instance.chunk_title_book = chunk_string + ' ' + ' '.join(instance.title.split())
  1. 在应用的apps.py文件中注册信号:
from django.apps import AppConfig

class YourAppNameConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'your_app_name'  # 替换为你的实际应用名称

    def ready(self):
        import your_app_name.signals  # 替换为你的实际应用名称

补充说明

  • 若数据库中已有存量书籍数据,需要手动更新这些数据的chunk_title_book字段,可以通过Django Shell执行:
from your_app_name.models import Book

for book in Book.objects.all():
    book.chunk_title_book = book.chunk_title(book.title)
    book.save()
  • 建议在chunk_title方法中添加空值判断,避免title为空时出现异常。

内容的提问来源于stack exchange,提问作者Dimaapp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:01:02