[Django] on_delete 옵션 잘 쓰기

이승연·2020년 12월 30일
0

DJango

목록 보기
3/11
post-thumbnail

멘토님 on_delete 옵션에 전부 SET_NULL 이 들어가있는데, 참조대상이 delete 될 경우 데이터는 전부 유지하려고 의도하신걸까요?

승연 데이터 공간 확보가 중요했던 옛날에는 ON DELETE CASCADE를 썼지만 데이터 보존이 더 중요해진 지금은 ON DELETE SET_NULL을 쓴다고 배워서 그렇게 설정했습니다!

멘토님 말씀하신 부분 정확합니다! 하지만 지금 모델에서는 FK 가 NULL인 부분을 빼고 쿼리 날려서 가져올 수 있는 방법이 없습니다. 보통 이럴때는 deleted_at 이라는 컬럼을 주고 해당 필드에 시간이 존재하면 delete 된 정보로 생각을하고 로직에서 필터링을 해가지고 오는 방법이 있습니다!

승연 아하 그러면 foreign key로 연결된 모든 모델 (뿐만 아니라 웬만하면 모든 모델에 대하여?) deleted_at이라는 필드를 만들어주고 models.DateTimeField(auto_now_add = True) 이라는 값을 주면 된다고 이해를 했는데 맞나요??

멘토님 음 아니요! auto_now_add 를 주시면 생성시 바로 데이터가 들어가지면 저희가 원하는것은 기존에는 NULL 이어야 하겠죠? 지우는 액션이 발생할 시 timezone.now() 로 넣어주시면 됩니다. 그건 view 에서 하면 되구요!

승연 그럼 웬만한 모델 안에 deleted_at 필드 추가하고 null=True값 부여한 후 다시 푸쉬하겠습니다!!!!!

멘토님 네엡!!

결과:

deleted_at = models.DateTimeField(null = True) 

0개의 댓글