'Projects/django'에 해당되는 글 2건

// 선 reference : https://docs.djangoproject.com/en/dev/topics/serialization/


장고에서 기본 json serializer를 이용하면 내가 원치 않는 형식으로 나오게 된다.


pk가 노출되거나, model명이 나오거나, fields 밑에 필드가 나오거나...


물론 이걸 장고 내에서 그대로 deserialize 하는 경우에는 별 문제 없이 작동하겠지만, 다른 플랫폼과 통신하는 용도로 쓰기에는 조금 무리가 있다.


이전 프로젝트에서는 클라이언트에서 거의 무조건적으로 서버의 형식에 맞춰줬는데, 조금 비효율이었다.


그 당시 조사를 할 때는 해결 방안이 잘 보이지 않았는데 나중에 시간이 지나 비슷한 문제로 다시 검색을 하니 해결책이 보였다.





또는 더 응용하면 다른 원하는 형식으로 출력할 수 있겠더라.


장고 상에서 deserialize는

이런 식으로 하는데 앞의 serializers를 override하여 입맛에 맞게 바꿔주면 된다.


그냥 json serializer로 가면 어디를 손대야 할지 잘 보이지 않는다.


여기보다는 json serializer가 상속한 python serializer의 get_dump_object를 조금 수정하면 된다.



여기에서 models와 fields 필드를 붙이는 걸로 보인다.


그러니 serializer를 상속하고 get_dump_object를 override 해서 원하는 형식으로 object를 dump하도록 하면 된다.



// 출처 : http://stackoverflow.com/questions/15453072/django-serializers-to-json-custom-json-output-format

'Projects > django' 카테고리의 다른 글

django에서 BigIntegerField로 pk나 fk 쓰기  (0) 2015.02.12
Posted by 병아리

블로그를 해킹당한 이후로는 관리하기 귀찮아서 쳐다보지도 않았는데, 오늘 코딩하다가 무언가 기록해야할 필요성이 있다고 생각되는 것을 알게 되었는데 이것을 기록할 곳이 없어서 잠시 고민하다가 결국 여기로 다시 돌아왔다.


자주 적지는 못하(않?)겠지만 그래도 오늘처럼 알아내는데 시간이 제법 걸리거나, 다음에 또 쓸 가능성이 있는 것들은 같은 사항으로 고민하는 다른 코더들을 위해, 그리고 바보같이 또 인터넷을 헤매며 삽질하고 있을 미래의 나를 위해 적어두어야겠다.



아, 참고로 이 방법은 1.7.3의 장고와 파이선 3.x 에서 이용가능하다.

issue가 올라와 있으니까 언젠가는 built-in으로 사용가능하겠지만, 그 전까지는 현재 버전의 상황에 맞게 살짝 바꿔서 사용해야 할 것이다.



그럼 배경설명부터...


django에서 모델을 정의할 때, 일반적으로는 pk를 서술하지 않는다.

왜냐하면 아무 필드에 primary_key=True를 먹이지 않는한, 장고에서 알아서 만들어서 추가해준다.

https://docs.djangoproject.com/en/1.7/topics/db/models/#automatic-primary-key-fields

https://docs.djangoproject.com/en/1.7/ref/models/fields/#autofield


일반적인 작은 웹 프로젝트의 경우에는 별 문제없이 사용할 수 있지만, 상황에 따라 pk가 일정 범위를 넘는 경우가 생길 수 있는데, 이때는 int만으로는 버거울 수도 있다.



그래서 아무 생각없이 BigIntegerField를 id로 정의하고 primary_key를 주고나서 새로생긴 migrate 기능을 이용해서 alter를 시도하니 안되더라... (내가 잘못한걸 수도 있음...)


인터넷을 찾아보니 구글에서도 비슷한 질문을 올린 사람들이 꽤나 있었다.

위에 issue도 올라온지 4년이 넘었는데 아직까지 기능추가가 되지 않았더라.

하긴, 1씩 커져서 저 큰 숫자를 넘긴다는게 정말 쉽지는 않겠지...


첫번째 댓글에 있는

이것도 시도해봤는데, 단순히 id로만 쓰는 경우에는 이걸로 해결될 수도 있겠지만, 나의 경우와 같이 다른 테이블에 foreign key로 묶여서 연결되어 있는 경우라면 아마 안될거다...


그래서 stackoverflow에서도 이것저것 찾아서 시도해보다가 이런걸 발견했다.

https://gist.github.com/thomasyip/3158388

설마 될까? 싶어서 가져와서 indentation만 조금 고쳐서 써봤는데 db 엔진을 매칭하는 부분이 현재 버전과 조금 달라 안되더라.

파이썬이나 장고를 잘 아는 사람은 여기까지만 읽어도 쉽게 해결하겠지만, 아닌 사람들(+미래의 나)을 위해 내가 실제 쓴 stub을 밑에 적어두도록 하겠다.

그리고 이전 버전에서 쓰였던 long()이 있기때문에 이것도 int()로 바꿔주었다

저작권은 github 링크의 저자에게 있는거겠지...?

그러니 이거 안된다, 저거 안된다 저에게는 묻지 말아주세요... 저도 아직 장고 초보랍니다 ㅜ_ㅜ

아, db는 mysql을 쓰고 있는 중이다. 당연히, 다른 db엔진에서는 전혀 테스트 된 바 없음...


// 추가

다른 db엔진에서 테스트 해볼 기회는 없었지만, sqlite3의 경우에는 "BIGINT"로 해야하는 것 같다...




이거 넣으려고 syntaxhighlighter까지 깔았다... 진작 써볼껄... 이거 좋네.



'Projects > django' 카테고리의 다른 글

custom json serializer in django  (0) 2015.05.14
Posted by 병아리

사이드바 열기