본문 바로가기
AI 웹개발반

[TIL] 수정 기능, save & update

by 째깍단 2023. 4. 15.

나머지 공부로 댓글 수정update 기능을 추가해보기로 한다.

이전에 쓰기create 삭제delete 기능들을 해보았으니 비슷한 결로 흘러갈 것이라 생각하고 시작.

 

 

 

 

적용과정

 

수정 기능은 이미 있는 db내용을 고치는 작업이다.

 

먼저 db에 저장된 row를 불러와야하고,

폼에 수정한 내용을 입력한 후 form 검증을 통과하면 db에 저장되는 방식을 사용한다. 

 

 

is_valid()를 통해 검증에 통과한 값이 저장되도록하는 두 가지 방법이 있다.

- save

- update

 

 

update() 함수로 코드를 작성하던 중 save로 코드를 찾아 바꾸는 팀코드를 보았고

두 가지 기능의 차이가 궁금해졌다.

 

어라 왜 두 가지지?하고 궁금하다면 참지말고 공부!

 

 

 

 

 

 

- 과정1 -  함수 기능 되짚어보기

이왕 하는 김에 crud기능에 자주 쓰이는 함수들을 알아보며 기초를 확인해보자

 

 

  • save()
    객체를 저장하는 기능이다. object를 만든 후 꼭 save해야 db에 기록된다. 
    save는 자체 반환값이 없어 save한 db내용을 가져다 쓰고 싶다면 지정하여 불러오도록 해야한다.

 

  • create()
    값을 만들고, 저장하기를 한 번에 하고 싶을때 사용한다.
    사전형(**kwarg) 값을 받는 메서드다.
#1
dessert = Dessert.objects.create(cake = “chocolatecake”, candy = “strawberry candy”)

#2
dessert = Dessert(cake = “chocolate cake”, candy = “strawberry candy”)
dessert.save(force_insert = True)

 

force_insert 매개변수의 True값은 항상 새 개체가 생성된다는 것이다.

물론 unique 값을 새로이 입력하려 하면 오류가 날 것임

 

[참조] : https://docs.djangoproject.com/en/4.2/ref/models/querysets/#django.db.models.query.QuerySet.create

 

 

 

  • update()
    지정된 필드를 업데이트하고 값을 반환한다.
    충돌 없이 지정된 순서대로 고유 필드를 수정하는 데에 유용하고, create와 마찬가지로 사전형(**kwarg) 값을 받는다.

    update()는 즉시 적용되고, 유일한 제한 사항은 해당 모델의 기본 테이블에 있는 열만 업데이트할 수 있다는 것
    filter로 걸러낸 여러 개의 자료를 한 번에 update로 수정할 수도 있다.
    충돌 없이 지정된 순서대로 고유한 필드를 업데이트하는 데 유용하다.
    **update()+order_by()절에 주석, 상속된 필드 또는 조회 스패닝 관계가 포함되어 있으면 절이 무시된다.**

[참조] :  https://docs.djangoproject.com/en/4.2/ref/models/querysets/#django.db.models.query.QuerySet.update

 

 

 

  • delete()
    삭제할 개체를 가리키는 외래 키가 있는 모든 개체가 함께 삭제된다
    = 게시글에 달린 댓글들도 함께 사라짐 (on_delete=CASCADE 로 받았을 경우. on_delete관련 문서를 찾아 방법을 바꿀 수 있다.)

[참조] : https://docs.djangoproject.com/en/4.2/ref/models/querysets/#django.db.models.query.QuerySet.delete

 

 

 

update와, save 의 차이점

  • update는 db테이블에 있는 데이터 값만 수정할 수 있다.
  • save는 db테이블 있는 값을 저장하고, 새로운 값은 새로운 테이블을 만들어 저장할 수 있다.

 

 

 

+++ 추가 +++

- cleaned_data :

  cleaned_data는 form에 값이 입력되고 validate(검증)된 후의 데이터가 잠시 저장되는 변수라고 할 수 있다.

  cleaned_data['keys']  저장된 데이터의 'key'값을 넣어준다!

 

Form 처리의 흐름

1) form에 데이터를 입력하고 request 들어옴

2) 입력된 데이터를 validate  (= is_valid)

3) 적절한 데이터로 판명된 후 cleaned_data에 값이 대입

 => title = form.cleaned_data['title']

 

 

 

 

 

- 과정2 - 

두 가지 방법이 모두 유효하다는 것을 확인했으니 함수를 작성해 각각 테스트해본다.

 

>>>>>>>>아직 미검증 함수입니다.

<<<<<<<<오류는 없어서 될거라고 생각하지만 테스팅 안함

 

 

 

 

# update() 함수로 작성

is_vaild()를 통과한 값을 cleaned_data 변수로 변환하여 사전타입으로 만들어준다. 

 

if form.is_valid():
comment = comment.update(
    content=form.cleaned_data[“content”],
    updated_at=form.cleaned_data[“updated_at”],
)

 

 

 

# save() 함수로 작성

save하는 필드의 이름을 save함수 내의 update_fields 에 지정해주어 db에서 필요한 부분만 수정하도록 한다.

 

if form.is_valid():
    comment = comment.save(update_fields=["content", "updated_at"])

 

이때 save()의 키워드 인수에 update_fields 를 사용하여 이름이 지정된 필드만 업데이트되도록 한다.

하나 또는 개의 필드만 업데이트하려는 경우에 사용하고, 모든 필드를 업데이트하지 않음으로써 약간의 성능상 이점을 얻는다.

 

 

[참조] : https://docs.djangoproject.com/en/4.2/ref/models/instances/#specifying-which-fields-to-save