Vue-Django Read API
axios list Srialize
api/views_util.py 를 만들어 obj_to_post() 메서드를 정의해준다.
def obj_to_post(obj):
post=dict(vars(obj))
# convert to string
return post
obj를 dictionary로 바꿔주고 post dictionary에 있는 내용을 string으로 바꿔준 다음에 최종 딕셔너리 타입은 post를 리턴해준다.
json 타입을 serialize 한다는 의미를 간단하게 얘기하면 파이썬의 객체를 string의 형태로 형변환하는 과정이라고 말할 수 있다.
*
django shell에서 실습해보자.python manage.py shell
>>> from blog.models import *
>>> Post.objects.all()
<QuerySet [<Post: cheack>]>
>>> obj = Post.objects.all()[0]
>>> obj
<Post: cheack>
>>> vars(obj)
{'_state': <django.db.models.base.ModelState object at 0x00000193D41E5880>, 'id': 1, 'title': 'cheack', 'descrip
tion': 'asdfas', 'content': 'asdfasdfasfasdfasfasd', 'create_dt': datetime.datetime(2021, 4, 22, 20, 3, 20, 5425
38), 'modify_dt': datetime.datetime(2021, 4, 22, 20, 3, 20, 542538), 'owner_id': 1}
>>> v= vars(obj)
>>> dict(vars(obj))
{'_state': <django.db.models.base.ModelState object at 0x00000193D41E5880>, 'id': 1, 'title': 'cheack', 'descrip
tion': 'asdfas', 'content': 'asdfasdfasfasdfasfasd', 'create_dt': datetime.datetime(2021, 4, 22, 20, 3, 20, 5425
38), 'modify_dt': datetime.datetime(2021, 4, 22, 20, 3, 20, 542538), 'owner_id': 1}
파이썬 객체에 vars 함수를 적용시키면 객체를 dictionary로 바꿀 수 있다. vars(obj) 한다음에 dict를 적용해도 동일한 dictionary를 얻게되는데 한가지 다른점이 있다. 각각 v, vv로 지정해 id(v), id(vv)로 메모리 주소를 보면 다르다. 즉 dict를 씌워주면 복사본이 생긴다. 우리는복사본을 쓸 것이다.
1. post
>>> post = dict(vars(obj))
>>> for k in post:
... print(k)
...
_state
id
title
description
content
create_dt
modify_dt
owner_id
post key 를 보면 _state는 파이썬 내부 처리용으로 만들어진 정보이므로 삭제할 예정, 다른 필드들도 serialize과정에 변경된다. 이렇게 변경되니까 원본 유지를 위해 복사본을 사용한다.
2. modify_dt
>>> obj.modify_dt
datetime.datetime(2021, 4, 22, 20, 3, 20, 542538)
obj의 modify_dt는 파이썬의 datetime 객체인데 스트링으로 바꾸려면 어떻게해야할까 -> 스트링포맷타임 메서드 사용
>>> obj.modify_dt.strftime('%Y-%m-%d %H:%M')
'2021-04-22 20:03'
3. obj.tags
obj.tags를 스트링으로 바꾸려면 어떻게 해야할까
>>> obj.tags
<taggit.managers._TaggableManager object at 0x00000193D41F2280>
obj.tags.all() 하면 테이블에서 그 오브젝트에 달려있는 태그들을 모두 가져오고
>>> obj.tags.all()
<QuerySet [<Tag: fdsf>]>
리스트 컴프리헨션을 사용하면 tag.name이 스트링이기 때문에 스트링을 담은 리스트로 변경할 수 있다.
>>> [tag.name for tag in obj.tags.all()]
['fdsf']
4. owner
uwer타입의 객체인데
>>> obj.owner
<User: Aiden-Kwak>
username 속성을 사용하면 스트링을 얻을 수 있다.
>>> obj.owner.username
'Aiden-Kwak'
이것들을 이제 views_util.py에 코딩하자
def obj_to_post(obj):
post=dict(vars(obj))
# convert to string
if obj.modify_dt:
post['modify_dt'] = obj.modify_dt.strftime('%Y-%m-%d %H:%M')
else:
post['modify_dt'] = ''
if obj.tags:
post['tags'] = [tag.name for tag in obj.tags.all()]
else:
post['tags'] = []
if obj.owner:
post['owner'] = obj.owner.username
else:
post['owner'] = 'Anonymous'
del post['_state']
return post
마지막으로 views.py에 임포트.
'웹 프로그래밍' 카테고리의 다른 글
[pinterest clone (2)] Pycharm setup (0) | 2021.04.25 |
---|---|
[pinterest clone (1)] 기술스택 (0) | 2021.04.25 |
[Django Tutorial] Blog 만들기 (17) (0) | 2021.04.24 |
[Django Tutorial] Blog 만들기 (16) (0) | 2021.04.24 |
[Django Tutorial] Blog 만들기 (15) (0) | 2021.04.23 |