重写保存方法 – Django模型
save方法是一个继承自models.Model的方法,它被执行来保存一个实例到一个特定的Model。每当人们试图从管理界面或django shell创建一个模型的实例时,save()函数就会被运行。我们可以在将数据存储到数据库中之前覆盖save函数,以应用一些约束条件或填充一些只准备好的字段,如SlugField。
从技术上讲,我们不建议覆盖保存方法来实现这些功能,因为保存方法中的任何错误都会导致整个数据库崩溃。因此,如果你在编写保存方法和错误处理方面很完美,或者不要尝试保存方法,而是尝试在表单、视图、模型等方面实现这些功能。
Django重写保存方法的解释
用一个例子来说明重写保存方法。考虑一个名为geeksforgeeks的项目,它有一个名为geeks的应用程序。
在geeks应用程序的models.py文件中输入以下代码。我们将使用CharField对所有的字段选项进行实验。我们将覆盖保存方法来自动填充SlugField。
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的函数。让我们试着创建一个 “Gfg是最好的网站 “的实例。
让我们检查一下我们在管理界面创建的内容。
重写保存方法的高级概念
正如本文开头所定义的,通常不建议重写保存方法。让我们来看看为什么?
上述代码在每次使用保存方法或对模型做任何改变时都会重新创建lug。
第二个原因是,如果一个人只需要改变标题,但不需要改变lug,因为slug是重定向到一个特定的链接,并且在一些搜索引擎上有排名。在生产服务器中会产生一个很大的问题。这使得这种验证方法的使用不幸地不正确。可以有多种方法来解决上述问题,可以将slug声明为只读字段,然后在对overridden方法中的slug做任何修改之前,我们可以检查它是否为空。这可能会解决这个问题。所以建议在你能够处理保存方法中的错误之前,不要覆盖它。