Переопределение метода сохранения - модели Django

Опубликовано: 25 Февраля, 2022

The save method is an inherited method from models.Model which is executed to save an instance into a particular Model. Whenever one tries to create an instance of a model either from admin interface or django shell, save() function is run. We can override save function before storing the data in the database to apply some constraint or fill some ready only fields like SlugField.
Technically it is not recommended to override the save method to implement such functionalities because any error in save method lets to crash of whole database. So either if you are perfect at writing save method and error handling or don’t try save method and try to implement these functionalities either in forms, views, models, etc.

Django Overriding the Save Method Explanation

Illustration of overriding the save method using an Example. Consider a project named geeksforgeeks having an app named 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 ?

Enter the following code into models.py file of geeks app. We will be using CharField for experimenting for all field options. We will override the save method to fill up the SlugField automatically.

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 - лучший веб-сайт».

Давайте проверим, что мы создали в админке.

Расширенные концепции с отменой метода сохранения

Как указано в начале этой статьи, часто не рекомендуется переопределять метод сохранения. Давайте проверим, почему?
Приведенный выше код воссоздает слаг каждый раз, когда используется метод сохранения или если в модель вносятся какие-либо изменения.
Вторая причина заключается в том, что нужно изменить только заголовок, но не слаг, поскольку слаг перенаправляет на конкретную ссылку и ранжируется в какой-то поисковой системе. На рабочем сервере может возникнуть большая проблема. К сожалению, это делает использование этого метода проверки некорректным. Существует несколько способов решения вышеуказанной проблемы: можно объявить slug как поле только для чтения, а затем, прежде чем вносить какие-либо изменения в slug в переопределенном методе, мы можем проверить, пусто ли оно. Это может решить проблему. Поэтому, как рекомендуется, пока вы не научитесь обрабатывать ошибки в методе сохранения, не переопределяйте его.

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.