원래는 어떤 모델의 instance를 생성할 때 foregin key field가 있으면 .get()으로 객체를 가져와서 넣어주거나 serializer을 통해 넣어줘야했었다. 근데 최근에 일단 validation을 통과하지 못할 객체를 만들고, custom 전처리 함수를 통해 필드들을 전처리 후에 validation과 생성을 하고 싶은 상황이 생겼다. 근데 이 때 프론트에서 주는 데이터를 일단 instance에 넣고, 전처리 함수와 validation을 통해서 valid한 instance가 되게 하려는데 foreign key field가 integer가 아닌 model을 받아야 된다고 예외를 던져줘서 방법을 찾아봤더니

{foreign_key}_id라는 field가 따로 있어서 그 필드에 일단 integer을 넣고, 생성을 하게 하면 django model이 foreign key field에 {foreign_key}_id라는 걸 참조해서 model을 넣어준다. serializer을 통하지 않고, 객체를 따로 불러와서 넣어주지 않으면서 integer로 일단 필드값을 넣어주고 싶을 때 이 방법을 사용하면 괜찮을 것 같다.

'Programming' 카테고리의 다른 글

django를 쓰다가 spring을 쓰면서 느낀 점  (0) 2022.05.14
soft delete를 해보면서 느낀 점  (0) 2022.04.16
django의 transaction  (0) 2022.02.03
spring mvc vs. django mvc(mvt?) 패턴  (0) 2022.02.02
python decorator와 spring AOP  (0) 2022.02.01

가끔 django와 관련된 글들을 보면 django가 mvc 패턴을 따르도록(?) 되어있다고 되어있는데 반은 맞고 반은 틀린 말 같다.

왜냐하면 동작하는 방식은 mvc 패턴이 맞는데 사용하는 단어들은 mvc패턴과 약간 다르기 때문이다. spring을 보면 mvc 패턴을 따르게 만들면 사용하는 클래스들의 이름도 model, view, controller다. 근데 django에는 controller가 없다. view도 그 view가 아닌 것 같다(!) django에서는 urls, views들이 합쳐져서 controller의 역할한다고 봐도 무방할 것 같다. 그리고 mvc pattern에서 view는 사용자가 보는 걸 지칭하는데 django에서는 template이 그 역할을 한다. 이런 것들이 django mvc라고 검색을 하면 mvt(model, view, template)라는 단어가 같이 등장하는 이유라고 볼 수 있을 것 같다.

또 django에서는 단순히 template가 view만을 대체하는 게 아니라 forms를 포함시킬 수도 있다. django rest framework가 아닌 순수한 django를 사용하게 되면 template를 만들 때 forms.py를 이용해서 form을 만듦과 동시에 validation을 수행할 수도 있다.특히 이걸 잘 다루기 위해서 jinja2라는 언어(?)를 알아두면 좋다. spring에서는 thymeleaf라는 모듈이 있듯이. 근데 백엔드 개발을 하다보면 오히려 이런 template 언어를 다뤄야할 때 어려움을 겪는 것 같다...ㅋㅋㅋ

+ Recent posts