클라이언트로부터 주인과 강아지 데이터를 받아 생성하고, 저장된 데이터를 전송하는 작업을 해본다.
주인과 강아지 테이블 2개를 만든다. 주인 1명에 강아지가 여러 마리인 1:N 관계이다.
모델의 클래스가 테이블을 의미한다면, 뷰의 클래스는 하나 하나의 웹페이지를 의미한다. 주인과 강아지 데이터를 따로 보여줄 것이기 때문에 2개의 클래스를 만든다.
클라이언트가 입력한 데이터를 뷰에서 가공하여 데이터베이스에 넣어준다. 클라이언트는 POST 메소드로 서버에 요청한다. 요청 메소드는 메인 url -> 해당 앱 ulr로 전달된다. 앱 url은 해당 뷰의 메소드에 전달한다. 클라이언트는 Json 형식으로 요청하고, 파이썬이 이해할 수 있는 언어로 가공시킨다.
클라이언트가 가져온 주인 데이터를 해당하는 테이블 필드에 넣어준다. 이후 JsonResponse 로 응답해준다. 응답은 status 코드를 명시하고 메세지는 딕셔너리 형태로 보내준다.
클라이언트의 요청이 데이터베이스에 잘 저장되었다. 클라이언트가 주인 데이터를 보고싶다면 GET 메소드로 요청할 것이다. 우리는 뷰에서 get 메소드를 만들어서 응답하도록 한다.
먼저 데이터베이스의 주인 정보를 모두 가져온다. 주인 하나 하나에 대해 리스트에 추가한다. 여기서 고려해야 하는 부분은 주인 1명에 강아지가 여러 마리이므로 for문을 돌리거나 filter 메소드를 사용해야 한다는 것이다.
처음에 dog의 value를 list로 묶지 않았는데 쿼리 형태를 지원하지 않는다?!
같은 에러가 발생했다. filter 메소드가 쿼리셋으로 반환하는데 뷰에서는 이를 출력하지 못한다. 뷰가 이해할 수 있는 타입으로 작성해야 한다.
강아지의 모든 필드값이 응답되어, 이름과 나이만 나오도록 다시 가공해야 한다.
value를 가급적 사용하지 말라고 했는데, 이 value가 그 value인 줄 모르고 써버렸다.. 다른 방법으로는 for문이 있고 추가과제에서는 for문을 사용해봐야겠다.
클라이언트는 강아지 정보와 주인 정보를 같이 전송한다. 주인 id를 넘겨주기로 한다. 이름은 동명이인이 있을 수 있기 때문에 중복 없는 id로 넘겨주는게 좀 더 정확하다. 각각 강아지 주인은 1명만 존재하므로 filter 가 아닌 get 메소드가 더 목적에 맞다.
강아지 데이터를 조회할 때 강아지의 이름과 나이, 주인 이름을 보여주기로 한다.
클라이언트의 요청 url을 분석하여, 해당하는 url로 보내준다.
"owners/" 를 포함하는 url은 owners app의 urls.py 로 이동한다.
get 함수는 테스트를 위해 쓴 코드를 미처 삭제하지 못했다. 해당 과제와 관련 없으므로 넘어간다.
"owners/owner/"는 view의 OwnerView 클래스가 받도록,
"owners/dog/"은 view의 DogView 클래스가 받도록,
"as_view"에서 클라이언트 메소드 종류를 파악하여, view의 맞는 메소드로 보내준다.