我正在开发一个使用Django构建的内部工具.我们使用该工具所做的部分工作是将旧PDF中的内容数字化.PDF经历了某种OCR过程,但这给它们留下了频繁的两倍或三倍的空格和每行结尾处的硬回报.我们使用此文本在Django的内置管理中创建数据库对象.

假设我有一个这样的数据模型:

import re
from django.db import models
from django.db.models import CharField, TextField

class Widget(models.Model):
    name = CharField()
    description = TextField()
    
    def fix_description(self):
        self.description = re.sub(r"\s+", " ", self.description)
        self.description = re.sub(r"\\n", "\n", self.description)
        self.description = re.sub(r" *\n *", "\n", self.description)

大多数情况下,description中的文本将是一个单独的段落.有时它应该包含实际的换行符,我想通过在创建对象时在Django admin的Description字段中键入\n来表示这一点.fix_description方法完全按照我们的意愿清除了意外的空格,并保留了手动输入的换行符.

我想让fix_description在通过管理表单创建对象时只运行一次,然后再也不运行一次.我不想担心在更新描述时运行这段代码,因为如果发生这种情况,它将删除我们希望出现的换行符.做这件事最好的方法是什么?

推荐答案

答案是here,我只是根据您的具体需要进行了调整.

而不是创建函数fix_description,覆盖save()方法. 由于您不希望每次保存Widget实例时都运行该函数,因此仅在第一次保存时运行,您可以通过查看对象是否具有主键pk来判断该对象是否已经在数据库中. 如果是,则对象已经在数据库中,因此不要运行该函数.

class Widget(models.Model):
    name = CharField()
    description = TextField()

    def save(self, *args, **kwargs):
        # run the following only if the object is not in the database
        if not self.pk:
            self.description = re.sub(r"\s+", " ", self.description)
            self.description = re.sub(r"\\n", "\n", self.description)
            self.description = re.sub(r" *\n *", "\n", self.description)
        # you have to call the super method to actually save the object
        super(Widget, self).save(*args, **kwargs)

另一种 Select 是覆盖__init__方法而不是save()方法.这样您就不需要判断对象是否在数据库中,因为__init__只在实例化对象时调用,而不是在进行更改和再次保存时调用.但建议使用not种方法来替代__init__种方法.

docs个人给出了处理这种情况的其他方法,而不是凌驾于__init__之上,但我认为我给出的已经解决了你的情况.

Django相关问答推荐

Django相关对象引用模板

我希望用户能够预订相同的桌子,但不是在同一时间

django-filter compose 过滤的 url

一次请求中更新整个Django模型

Django多对多关系报错:<title> object (None)>需要先设置id字段的值.

Django 表单字段必填和可选配置

Django 长时间运行带有线程/处理的异步任务

使用 Python/Django 上传大文件

ModelForm 的 Django TextField max_length 验证

在 Scrapy 中访问 django 模型

Django 从字段开始

在 django web 应用程序中,如何给用户自己的子域?

django 复数模板

Django rest-auth allauth 注册,带有邮箱、名字和姓氏,没有用户名

如何使用 SQL 的IN等字段上的数组过滤 django 查询集?

导入错误无法在windows环境下导入名称execute_manager

django post_save 更新信号

Django urls 直接到 html 模板

django 静态文件版本控制

它是如何工作的,Django INSTALLED_APPS 的命名约定?