覆盖保存方法 – Django 模型
save 方法是从 models.Model 继承的方法,执行该方法以将实例保存到特定的模型中。每当尝试从管理界面或 django shell 创建模型实例时,就会运行 save()函数。我们可以在将数据存储到数据库之前覆盖保存函数,以应用一些约束或填充一些现成的字段,如 SlugField。
从技术上讲,不建议重写 save 方法来实现这些功能,因为 save 方法中的任何错误都会导致整个数据库崩溃。因此,如果您擅长编写保存方法和错误处理,或者不尝试保存方法并尝试在表单、视图、模型等中实现这些功能。
Django 覆盖保存方法说明
使用示例覆盖保存方法的图示。考虑一个名为 geeksforgeeks 的项目,它有一个名为 geeks 的应用程序。
Refer to the following articles to check how to create a project and an app in Django.
- How to Create a Basic Project using MVT in Django?
- How to Create an App in Django ?
在极客应用的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 是最好的网站”的实例。
让我们检查我们在管理界面中创建的内容。
覆盖保存方法的高级概念
正如本文开头所定义的,通常不建议覆盖 save 方法。让我们检查一下为什么?
每次使用 save 方法或对模型进行任何更改时,上面的代码都会重新创建 slug。
第二个原因是如果一个人只需要更改标题而不是 slug,因为 slug 正在重定向到特定链接并在某些搜索引擎上排名。在生产服务器中会产生一个很大的问题。不幸的是,这使得使用这种验证方法不正确。可以有多种方法来解决上述问题,一种可以将 slug 声明为只读字段,然后在对覆盖方法中的 slug 进行任何更改之前,我们可以检查它是否为空。这可能会解决问题。因此,在您能够处理保存方法中的错误之前,请不要覆盖它。