Вызывает ли obj.save() в save_model() в admin.ModelAdmin вызов save() в models.Model?

Я переопределил "save()" в классе "Person(models.Model)", как показано ниже:

# "models.py"

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

Затем, я также переопределил "save_model()" в "PersonAdmin(admin.ModelAdmin)" class как показано ниже:

# "admin.py"

from django.contrib import admin
from .models import Person

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        super().save_model(request, obj, form, change)

Тогда я могу добавить "Стив Джобс" как показано ниже:

enter image description here

Далее, для "save_model()" в "PersonAdmin(admin.ModelAdmin)" class, я заменил "super().save_model(request, obj, form, change)" на "pass" как показано ниже:

# "admin.py"

from django.contrib import admin
from .models import Person

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        pass
        # super().save_model(request, obj, form, change)

Но теперь я не могу добавить "Билл Гейтс" как показано ниже:

enter image description here

Итак, я проверил save_model() на репозитории Django на GitHub. Затем, в "save_model()" в классе ModelAdmin(BaseModelAdmin)", "obj.save()" вызывается, как показано ниже:

# "django/django/contrib/admin/options.py"

# ...

class ModelAdmin(BaseModelAdmin):

    # ...

    def save_model(self, request, obj, form, change):
        """
        Given a model instance save it to the database.
        """
        obj.save() # Here

Итак, вызывает ли "obj.save()" вызов "save()" в "Person(models.Model)" классе?

Да "object.save()" вызовет метод этого объекта, который является Person(models.Model). Вы также можете увидеть в коде ModelAdmin enter link description here, где четко указано, что ModelAdmin просто добавляет функциональность, связанную с панелью администратора, к данной Model. А "save_model" - это использование моделей, построенных в методе save, поскольку ModelAdmin не наследует от модели(Person(models.Model)). Более подробную информацию вы можете найти в официальной документации Django введите описание ссылки здесь.

Вернуться на верх