본문 바로가기
개발/AWS

Django 앱 만들기 - model의 save와 admin의 save_model을 오버라이딩 하기

by ny0011 2021. 2. 2.
반응형

DB에 있는 요 모델의 메소드를 내 맘대로 바꿔보자

from django.db import models

docs.djangoproject.com/en/3.1/topics/db/models/#overriding-predefined-model-methods

docs를 참고해보면 save()와 delete()를 오버라이딩 할 수 있다고 한다.

 

내 모델 Class에서 save 메소드를 만들고 self에 있는 값을 찍어보면

이미 저장된 값이 아니라 바뀌는 내용을 출력함

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

그래서 city를 저장하기 전에 앞글자를 대문자로 바꿔주는 등 내가 하고싶은 작업을 끼워넣을 수 있당

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

 

모델 뿐만 아니라 Admin도 save를 오버라이딩 할 수 있다!

save_model()이란 걸 쓰면 되는 듯.

무시무시한 워닝을 살펴보니 오버라이딩 하면 object를 저장하는 코드도 만들어야 하나봄.

DB에서 쓴 것 처럼 super를 상속 받아서 실행하게 해도 될듯

Warning
When overriding ModelAdmin.save_model() and ModelAdmin.delete_model(), your code must save/delete the object. They aren’t meant for veto purposes, rather they allow you to perform extra operations.

docs.djangoproject.com/en/3.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model

    def save_model(self, request, obj, form, change):
        print(change)
        super().save_model(request, obj, form, change)

그리고 super.save_model()을 부르면 Model의 save()를 사용해서 object를 저장한다

=> Admin에서 save 버튼 누름 -> Model에 실제로 저장한다는 말인듯

Call super().save_model()  to save the object using Model.save().

Admin의 save_model의 정의 부분을 가니까... 띠용?? 

그냥 모델의 save() 함수만 부르고 끝난다...

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

 

댓글