본문 바로가기

매일 TIL

[내일배움캠프 10-4일] 장고 심화 주차 시작, Django-seed, Json Response, 직렬화

INSTALLED_APPS 순서

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # Third-party
    'django_seed',

    # Local
    'articles',
]
  1. 장고 내부 앱
  2. Third-party(갖다쓰는 앱)
  3. 내가 추가한 앱

순으로 배치하는 것이 좋다(필수는 아님)


Django-seed로 데이터 생성

모델은 만들었는데, 데이터 입력이 귀찮다... 임의의 데이터 자동으로 입력해줄 수 없나?

우선 django-seed를 받고

requirements에 freeze까지 해줌.

 

이제 seed를 만들어보자.

python manage.py seed articles --number=30 해주게 되면 -> 에러가 발생

psycopg2를 설치해주면 됨.

이후 다시 seed를 만들면 30개가 잘 만들어지는 것을 볼 수 있다.


Json Response

여태까지 우리는 html response를 진행했다. 이번에는 jason으로 받아보자.

path('json-01/', views.jason_01, name='jason_01'),

articles/urls.py

우선 경로는 동일하게 설정

from django.http import JsonResponse
def jason_01(request):
    articles = Article.objects.all()
    json_articles = []

    for article in articles:
        json_articles.append(
            {
                'title': article.title,
                'content': article.content,
                'created_at': article.created_at,
                'updated_at': article.updated_at,
            }
        )

    return JsonResponse(json_articles, safe=False)

articles/views.py

뷰는 이런식으로 생성.

장고는 내부적으로 JsonResponse를 가지고 있음.

  • 첫번째 인자는 우리가 완성한 json_articles 리스트.
  • 두번째 인자는 첫번째 인자가 dict 형태이면 필요 없음, 지금은 리스트라 safe=False라고 해준다.

결국 우리는 DB에서 조회해온 객체 articles(쿼리셋)를 -> 직접 리스트를 만들어 Json 형태로 만들어 준 것임.

이런 식으로 표시된다.

와@@@@@@@@@@@@ 템플릿이 없다. 와@@@@@@@@@@


직렬화(Serialization)

객체 또는 데이터 구조를 저장, 전송을 위해 다른 포맷으로 변경하는 것.
데이터의 구조는 유지하면서, 추후 재구성이 가능한 포맷으로 변환.
    json_articles = []

    for article in articles:
        json_articles.append(
            {
                'title': article.title,
                'content': article.content,
                'created_at': article.created_at,
                'updated_at': article.updated_at,
            }
        )

방금 만든 뷰의 내용. 우리가 한게 직렬화다.

변수로 받은 articles는 쿼리셋 -> 이걸 전송 가능한 Json 형태로 바꾼 것이 바로 직렬화.

 

django도 내부적으로 다른 데이터 포맷으로 쉽게 직렬화 할 수 있는 기능을 제공한다.

path('json-02/', views.json_02, name='json_02'),

articles/urls.py

우선 경로 만들고.

from django.core import serializers
path('json-02/', views.json_02, name='json_02'),
def json_02(request):
    articles = Article.objects.all()
    res_data = serializers.serialize('json', articles)
    return HttpResponse(res_data, content_type='application/json')

articles/views.py

res_data = serializers.serialize('json', articles)  -> serialize에서 포맷은 json, 직렬화할 데이터는 articles

return HttpResponse(res_data, content_type='application/json') -> 서버에서 클라로 보내는 res에 content_type이 application/json이라고 명시하는 것.

이런 식으로 표시됨.

 

어 좋은데? 내가 직접 리스트니 딕셔너리니 안만들고 편하다. 무조건 이걸로 사용하면 되는거 아님?

예를 들어 클라이언트가 "pk니 뭐니 다른 데이터 필요 없어요. title이랑 content만 주세요." 라고 한다면?

serializers.serialize를 사용하면 포맷을 커스텀할 수 없음. 즉 유연하지 않다는 것.

모델의 구조에 serialize가 묶여 있다고 생각하면 되는 것.

 

결국 우리는 모델에 종속적이지 않고 유연하면서 사용하기도 편한 Serializer가 필요하다!

그 대표적인게 바로 DRF(Django REST Framework)


오늘의 회고

오랜만에 수업들으니 잠이 솔솔왔음.

솔솔가라 잠아.

 

내일 목표는 강의 마저 듣기