# 가상환경에 설치된 목록 확인
pip list
# 설치
pip install django
pip install djangorestframework
pip install django-dotenv
pip freeze > requirements.txt
django-admin startproject drf_week2 .
시리얼라이즈
파이썬 객체나 queryset 객체 등을 JSON, XML 형태로 변환하는 것
반대로 JSON 형태를 DB 인스턴스로 변환하는 것은 디시리얼라이즈라고 한다.
JSON 이란?
Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷
딕셔너리처럼 Key와 Value 값을 가짐
*parse란? 데이터 해석. deserialization을 포괄 (ex. 압축해제, 코드 컴파일, 브라우저가 html 해석)
(app-models.py)
from django.db import models
class Articles(models.Model):
title = models.CharField(max_length=100)
content = models.TextField(blank=True, null=True)
crated_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
#admin 페이지에서 게시글 제목으로 나오게 하기
def __str__(self):
return str(self.title)
*urls.py, (app)admin.py, (app)urls.py 등의 설정 생략
(app - views.py)
from rest_framework.response import Response
def articleAPI(response):
return Response('연결되었습니다.')
(app - serializers.py 생성)
# field 타이핑 에러 :
#("Creating a ModelSerializer without either the 'fields' attribute or
#the 'exclude' attribute has been deprecated since 3.3.0, and is now disallowed.
#Add an explicit fields = '__all__' to the StockSerializer serializer.",)
from articles.models import Articles
from rest_framework import serializers
class ArticleSerialize(serializers.ModelSerializer):
class Meta:
model = Articles
# field 아님. 오타 주의
fields = '__all__'
시리얼라이즈 사용X vs 사용O
from rest_framework.response import Response
from rest_framework.decorators import api_view
from articles.models import Articles
from articles.serializers import ArticleSerialize
#브라우저블 API
@api_view(['GET', 'POST'])
def articleAPI(request):
articles = Articles.objects.all()
article = articles[0]
article_data = {
'title' : article.title,
'content' : article.content,
}
return Response(article_data)
#위와 아래 같은 코드
@api_view(['GET', 'POST'])
def articleAPI(request):
articles = Articles.objects.all()
# 여러개의 article을 가져올 때 many =True
serialize = ArticleSerialize(articles, many=True)
return Response(serialize.data)
모델 폼(forms.ModelForm) : 연결된 모델의 데이터를 저장. Meta 클래스가 필요.
form.py 생성하기
from django import forms
from .models import Product
class ProductForm(forms.ModelForm):
class Meta:
# Product 모델과 연결
model = Product
fields = ['product_name', 'price', 'desc']
views.py
def product_create(request):
if request.method == 'GET':
form = ProductForm()
return render(request, 'mall.html', {'form': form})
elif request.method == 'POST':
form = ProductForm(request.POST)
# 유효성 검사에 실패하면 다시 상품등록 페이지로 이동
if form.is_valid():
# 임시저장
product = form.save(commit=False)
product.user = request.user
product.save()
return redirect('/')
from django.urls import path
from . import views
app_name = 'order'
urlpatterns = [
path('<int:product_id>/', views.product_detail, name='product_detail'),
]
(mall.html)
<!--app_name order의 url 별칭이 product_detail-->
<!--다음과 같이 파라미터 명을 정의할 수 있다-->
<!--공백을 사용하여 여러개의 파라미터를 사용할 수 있다-->
{% url 'order:product_detail' product_id = shop.id page=2%}
{% for i in item %}
'''
여기서 forloop 사용 가능
forloop.counter 루프내의 순서로 1부터 표시
forloop.counter0 루프내의 순서로 0부터 표시
forloop.first 루프의 첫번째 순서인 경우 True
forloop.last 루프의 마지막 순서인 경우 True
'''
{% endfor %}
from django.contrib import admin
from .models import Product(모델명)
# admin 사이트에 Product 테이블 생성
admin.site.register(Product)
모델 검색
아래와 같이 수정하면 관리자 페이지에 검색기능을 추가할 수 있다.
from django.contrib import admin
from .models import Product
class ProductAdmin(admin.ModelAdmin):
search_fields = ['description']
admin.site.register(Product, ProductAdmin)