models.py
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
shell
$python manage.py migrate
$python manage.py seed articles --number=20
# urls.py
path('html/', views.article_html),
#views.py
def article_html(request):
articles = Article.objects.all()
context = {
'articles': articles,
}
return render(request, 'articles/article.html', context)
#urls.py
path('json-1/', views.article_json_1),
#views.py
def article_json_1(request):
articles = Article.objects.all()
articles_json = []
#article을 돌면서 json에 딕셔너리 형태로 append
for article in articles:
articles_json.append(
{
'id': article.pk,
'title': article.title,
'content': article.content,
'created_at': article.created_at,
'updated_at': article.updated_at,
}
)
return JsonResponse(articles_json, safe=False)
api/v1/json-1 호출
직렬화
데이터 구조나 객체 상태를 동일하거나 다른 컴퓨터 환경에 저장하고, 나중에 재구성할 수 있는 포맷으로 변환하는 과정
Serializers in Django
쿼리셋을 JSON으로 바꾸기 용이한 형태로 바꿔주는 것이다.
#urls.py
path('json-2/', views.article_json_2),
#views.py
from django.core import serializers
def article_json_2(request):
articles = Article.objects.all()
#data는 직렬화된 객체
data = serializers.serialize('json', articles)
return HttpResponse(data, content_type='application/json')
$pip install djangorestframework
#settings.py
INSTALLED_APPS = [
'rest_framework',
]
#urls.py
path('json-3/', views.article_json_3),
#serializer.py
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__'
#views.py
@api_view()
def article_json_3(request):
articles = Article.objects.all()
#many=True는 들어오는 객체가 단일값이 아닐 때 설정 기본옵션은 False
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
ArticleSerializer는 ModelForm과 유사한 형태이다.
DRF가 django에서 modelform과 유사하게 사용할 수 있도록 구성을 modelform 똑같이 맞춰놓은 것
ArticleSerializer는 Article모델에 맞춰 자동으로 필드를 생성해 Serialize 해주는 ModelSerializer
many=True는 들어오는 객체가 단일값이 아닐 때 설정 기본옵션은 False
import requests
from pprint import pprint
response = requests.get('http://127.0.0.1:8000/api/v1/json-3/')
print(response)
#<Response [200]>
pprint(type(response))
#<class 'requests.models.Response'>
pprint(type(response.json()))
#<class 'list'>
articles_list = response.json()
for article in articles_list:
print(article.get('title'))
'''Will seven bed.
Because always third person together front act.
Official move agreement activity statement respond world.
Could available bill wear.
'''
Django | DRF | |
---|---|---|
Response | HTML | JSON |
Model | ModelForm | Serializer |