Model의 refresh_from_db() 를 호출할 때 현재 들고있는 object로의

 
Hyunjun Kim

Model의 refresh_from_db() 를 호출할 때 현재 들고있는 object로의 값 갱신이 setattr() 을 통해 이루어지므로, 개발자가 조작하는 일반 구현과 마찬가지로 assign 에 의한 validation이 호출되는 것으로 보입니다.

이게 문제가 되는게, 저는 django-enumfield라는 확장을 이용해 미리 정의되지 않은 state transition이 일어나는 경우를 막고자(이 부분이 validator로 구현됨) 했는데요, 다음과 같은 테스트 구현이 있습니다:
1. 객체 준비
2. 2번 이상의 transition이 일어나는 subprogram 호출
3. 객체 갱신 (refresh_from_db)
4. 변경된 상태 검증

여기서 2번 subprogram이 호출될 때 객체를 인자로 전달하지 않고, primary key만 전달하므로, 3번이 불가피한 상황인데, 1, 3번이 호출될 시점의 객체 입장에서는 정의되지 않은 transition이 일어나는 것으로 보여 validation 예외가 실패 합니다.

지금은 refresh_from_db 안 쓰고 Model.objects.get() 한번 더 호출하는 것으로 해결하긴 했습니다만 … 여튼 이런 상황을 유의하시길 바라며, 혹시 비슷한 상황 경험하신 분 중에 더 나은 해결책을 아시는 분 계시다면 도움을 부탁드립니다(_ _)

* https://github.com/django/django/blob/a82e21b0f9ac613db3354d46539cb97c897ea663/django/db/models/base.py#L589
* https://github.com/5monkeys/django-enumfield

  • Youngsoo Jung

    ㅎㅎ 쉬운 글은 아니네요. refresh_from_db 는 어떤 경우에 쓰면 좋을까요?

Advertisements