📜  覆盖保存方法 – Django 模型

📅  最后修改于: 2022-05-13 01:55:14.473000             🧑  作者: Mango

覆盖保存方法 – Django 模型

save 方法是从 models.Model 继承的方法,执行该方法以将实例保存到特定的模型中。每当尝试从管理界面或 django shell 创建模型实例时,就会运行 save()函数。我们可以在将数据存储到数据库之前覆盖保存函数,以应用一些约束或填充一些现成的字段,如 SlugField。
从技术上讲,不建议重写 save 方法来实现这些功能,因为 save 方法中的任何错误都会导致整个数据库崩溃。因此,如果您擅长编写保存方法和错误处理,或者不尝试保存方法并尝试在表单、视图、模型等中实现这些功能。

Django 覆盖保存方法说明

使用示例覆盖保存方法的图示。考虑一个名为 geeksforgeeks 的项目,它有一个名为 geeks 的应用程序。

极客应用的models.py文件中输入以下代码。我们将使用 CharField 来试验所有字段选项。我们将重写 save 方法以自动填充 SlugField。

Python3
from django.db import models
 
# importing slugify from django
from django.utils.text import slugify
 
# Create your models here.
class GeeksModel(models.Model):
    title = models.CharField(max_length = 200)
    slug = models.SlugField()
 
    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(GeeksModel, self).save(*args, **kwargs)


让我们解释一下在上面的代码中发生了什么。其父类的save() 方法将被覆盖,因此我们使用super 关键字。 slugify 是一个将任何字符串转换为 slug 的函数。所以我们基本上将标题转换为slug。让我们尝试创建一个“Gfg 是最好的网站”的实例。

django-models-overriding-save-method

让我们检查我们在管理界面中创建的内容。

django 覆盖保存方法

覆盖保存方法的高级概念

正如本文开头所定义的,通常不建议覆盖 save 方法。让我们检查一下为什么?
每次使用 save 方法或对模型进行任何更改时,上面的代码都会重新创建 slug。
第二个原因是如果一个人只需要更改标题而不是 slug,因为 slug 正在重定向到特定链接并在某些搜索引擎上排名。在生产服务器中会产生一个很大的问题。不幸的是,这使得使用这种验证方法不正确。可以有多种方法来解决上述问题,一种可以将 slug 声明为只读字段,然后在对覆盖方法中的 slug 进行任何更改之前,我们可以检查它是否为空。这可能会解决问题。因此,在您能够处理保存方法中的错误之前,请不要覆盖它。