https://codemonkyu.tistory.com/entry/Djnago-Django-rest-framework-활용하여-API-서버-만들기
프로젝트를 관리할 빈 폴더를 생성한다
생성한 폴더에서 가상환경을 생성하고 실행한다
가상환경 디렉터리 내에서 실행한다!
python -m venv [가상환경 이름]
#windows
[가상환경 이름]/scripts/activate.bat 실행
pip install django
pip install djangorestframework
Django project 생성하기 & Django app 생성하기
꼭 가상환경 디렉터리에서 빠져나온 후에 진행한다
# django-admin startproject [프로젝트이름] .
django-admin startproject mydjango .
# python manage.py startapp [앱이름]
python manage.py startapp api
#가상환경 들어가기
source myvenv/Scripts/activate
ALLOWED_HOSTS = ["*"]
# 생성한 api앱과 rest_framework를 추가해준다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'api',
'rest_framework'
]
#언어를 한국어로 변경해준다.
LANGUAGE_CODE = 'ko'
#시간
TIME_ZONE = 'Asia/Seoul'
manage.py가 있는 디렉터리에서 작업
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
추가설명
models.py에서 모델 클래스를 설정하면 데이터베이스에 테이블이 생성되는 것이다.
from django.db import models
# Create your models here.
class Item(models.Model):
name = models.CharField(max_length=100)
description = models.TextField(max_length=300)
cost = models.IntegerField()
| CharField | 제한된 문자열 필드 타입. 최대 길이를 max_length 옵션에 지정해야 한다. 문자열의 특별한 용도에 따라 CharField의 파생클래스로서, 이메일 주소를 체크를 하는 EmailField, IP 주소를 체크를 하는 GenericIPAddressField, 콤마로 정수를 분리한 CommaSeparatedIntegerField, 특정 폴더의 파일 패스를 표현하는 FilePathField, URL을 표현하는 URLField 등이 있다. |
|---|---|
| TextField | 대용량 문자열을 갖는 필드 |
| IntegerField | 32 비트 정수형 필드. 정수 사이즈에 따라 BigIntegerField, SmallIntegerField 을 사용할 수도 있다. |
| BooleanField | true/false 필드. Null 을 허용하기 위해서는 NullBooleanField를 사용한다. |
| DateTimeField | 날짜와 시간을 갖는 필드. 날짜만 가질 경우는 DateField, 시간만 가질 경우는 TimeField를 사용한다. |
| DecimalField | 소숫점을 갖는 decimal 필드 |
| BinaryField | 바이너리 데이타를 저장하는 필드 |
| FileField | 파일 업로드 필드 |
| ImageField | FileField의 파생클래스로서 이미지 파일인지 체크한다. |
| UUIDField | GUID (UUID)를 저장하는 필드 |
필드 옵션설명 💻
| null (Field.null) | null=True 이면, Empty 값을 DB에 NULL로 저장한다. DB에서 Null이 허용된다. 예: models.IntegerField(null=True) |
|---|---|
| blank (Field.blank) | blank=False 이면, 필드가 Required 필드이다. blank=True 이면, Optional 필드이다. 예: models.DateTimeField(blank=True) |
| primary_key (Field.primary_key) | 해당 필드가 Primary Key임을 표시한다. 예: models.CharField(max_length=10, primary_key=True) |
| unique (Field.unique) | 해당 필드가 테이블에서 Unique함을 표시한다. 해당 컬럼에 대해 Unique Index를 생성한다. 예: models.IntegerField(unique=True) |
| default (Field.default) | 필드의 디폴트값을 지정한다. 예: models.CharField(max_length=2, default="WA") |
| db_column (Field.db_column) | 컬럼명은 디폴트로 필드명을 사용하는데, 만약 다르게 쓸 경우 지정한다. |
만들어 놓은 앱 폴더 내에 serializers.py 생성해준다
serialiezer란 장고 모델 데이터를 json타입으로 바꿔주는 작업을 해준다. 즉 직렬화 작업을 해준다.
장고 모델 데이터를 json으로 바꿔주면 api 통신을 할 때 훨씬 편하게 작업할 수 있다.
from rest_framework import serializers
from .models import Item
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = ("__all__")
#fields = ('name', 'description', 'cost')
Viewset 생성
from django.shortcuts import render
from rest_framework import viewsets
from .serializers import ItemSerializer
from .models import Item
# Create your views here.
class ItemViewSet(viewsets.ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer
4.Router등록
만들어 놓은 앱 폴더 내에 urls.py를 생성한다. #api/urls.py
from django.urls import include, path
from rest_framework import routers
from . import views #views.py import
router = routers.DefaultRouter() #DefaultRouter를 설정
router.register('Item', views.ItemViewSet) #itemviewset 과 item이라는 router 등록
urlpatterns = [
path('', include(router.urls))
]
만들어 놓은 프로젝트 폴더내에 urls.py를 설정해준다. #mydjango/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('api.urls')), #api/urls.py 를 사용
]