[TIL] 파이썬 장고 프레임웍을 사용해서 API 서버 만들기 (1)

이원진·2023년 4월 24일
0

데브코스

목록 보기
11/54
post-thumbnail

학습 내용


  1. 개발환경 설정하기 for Mac

  2. Django Project 생성하기

  3. Django App 생성하기

  4. 모델 만들기

  5. Django의 다양한 모델 필드 활용하기

  6. Django Admin

  7. Django Shell

0. 개발환경 설정하기 for Mac


  • 서로 다른 유형과 목적의 프로젝트를 하나의 공간에서 관리하면, 매번 프로젝트를 실행할 때마다 환경을 체크하고 변경해줘야 하며, 프로젝트 간의 충돌이 발생할 수도 있음

    • 이러한 문제점을 방지하고 각각의 프로젝트를 효율적으로 관리하기 위해 가상환경을 사용

  • conda create -n django_env python = 3.9

  • conda activate django_env

  • pip3 install django


1. Django Project 생성하기


  • django-admin startproject projectname

  • manage.py: Django 프로젝트를 터미널에서 조작할 수 있는 명령 제공

    • project 디렉토리 내에서 python manage.py runserver: Django 서버 실행

    • 브라우저에서 localhost(127.0.0.1:8000) 으로 접속했을 때 위와 같이 출력되면 서버가 제대로 실행된 것


2. Django App 생성하기


  • Django project는 웹사이트, Django app은 웹페이지에 해당

  • python manage.py startapp polls: polls 라는 이름의 app 생성

  • url 추가

    • projectname/urls.py

      from django.contrib import admin
      from django.urls import path, include
      
      urlpatterns = [
      	# 'polls/'로 들어오는 요청은 polls app의 urls.py에서 처리
      	path('polls/', include('polls.urls')),
      	path('admin/', admin.site.urls),
      ]

    • polls/urls.py

      from django.urls import path
      from . import views
      
      urlpatterns = [
      	# 'polls/'로 요청이 들어올 경우, index 페이지 반환
      	path('', views.index, name = "index"),
      ]

    • polls/views.py

      from django.http import HttpResponse
      
      def index(request):
      	return HttpResponse("Hello, world.")
      

3. 모델 만들기


  • 관계형 데이터베이스(RDB: Relational DataBase)

    • 데이터를 행과 열로 이루어진 테이블의 형태로 구성하고, 테이블 간의 관계를 정의하는 데이터베이스

    • 열(Column)

      • 테이블에 존재하는 필드(Field)

      • Primary Key: 테이블의 각 행을 고유하게 식별할 수 있는 열

      • Foreign Key: 다른 테이블의 Primary Key를 참조하는 열

    • 행(Row)

      • 테이블에 저장된 데이터 레코드(Record)

  • 모델: Django에서 데이터베이스를 관리할 수 있는 ORM(Object Relation Mapping)의 일종

  • 모델 생성

    • polls/models.py

      from django.db import models
      
      # 질문 모델
      class Question(models.Model):
          question_text = models.CharField(max_length = 200)
          pub_date = models.DateTimeField('date published')
      
          # 생성한 지 하루 이내인지 확인하는 메서드
          def was_published_recently(self):
              return self.pub_date >= timezone.now() - datetime.timedelta(days = 1)
          
          def __str__(self):
              if self.was_published_recently():
                  new_badge = 'NEW!!'
          
              else:
                  new_badge = ''
          
              return f'{new_badge} 제목: {self.question_text}, 날짜: {self.pub_date}'
      
      # 답변 모델
      class Choice(models.Model):
          # Foreign Key를 사용해 질문 테이블과 관계 정의
          question = models.ForeignKey(Question, on_delete = models.CASCADE)
      
          choice_text = models.CharField(max_length = 200)
          votes = models.IntegerField(default = 0)

  • 모델에 대한 마이그레이션 진행

    • projectname/settings.py

      INSTALLED_APPS = [
          # 프로젝트에 polls app 등록
          'polls.apps.PollsConfig',
          ...
      ]

    • python manage.py makemigrations polls: 마이그레이션 생성

      • python manage.py sqlmigrate polls 0001: 마이그레이션 내용 출력

    • python manage.py migrate: 마이그레이션 진행(테이블 생성)


4. Django의 다양한 모델 필드 활용하기


  • https://docs.djangoproject.com/en/4.2/ref/models/fields/

    • 해당 Django 공식 문서에서 다양한 필드의 사용법 확인 가능

  • 자주 사용되는 필드

    • BooleanField

    • CharField

    • DateField

    • DateTimeField

    • FloatField

    • JSONField

    • TextField

  • Django에서 기본으로 제공하는 sqlite3 사용해 모델(테이블) 확인

    • sqlite3 db.sqlite3: sqlite3 터미널 접속

    • .tables: 전체 테이블 확인

    • .schema table_name: 테이블의 스키마(구조) 확인

    • Ctrl + D: 종료

  • 마이그레이션 되돌리기

    1. 해당하는 마이그레이션 파일을 migrations 폴더에서 삭제

    2. 이전 버전으로 마이그레이션 진행
      • python manage.py migrate polls 0001

    3. models.py 내용 이전 마이그레이션 내용과 맞추기

5. Django Admin


  • DB에 대한 CRUD(Create, Read, Update, Delete) 기능 제공

  • python manage.py createsuperuser: admin 계정 생성

    • Admin 사이트에 접속해서 새로운 유저 만든 뒤 Staff/Superuser Status 추가해서도 생성 가능

  • localhost:8080/admin: admin 사이트 접속

  • admin 사이트에 모델 등록하기

    • polls/admin.py

      from django.contrib import admin
      from .models import *
      
      # Register your models here.
      admin.site.register(Question)
      admin.site.register(Choice)

6. Django Shell


  • python manage.py shell: Django shell 진입

  • 자동으로 변경사항이 반영되지 않기 때문에 코드 수정 시 종료 후 재시작 해야 함

  • Question 객체 출력

    • Question.objects.all(): 모든 객체

    • Question.objects.first(): 첫 번째 객체

    • Question.objects.last(): 마지막 객체

  • Question 객체와 Choice 객체가 일대다 관계일 경우

    • question.choice_set.all(): Question 객체와 연결된 모든 Choice 객체 접근

      • Choice 객체들이 담긴 QuerySet 반환

    • choice.question: Choice 객체에서 Question 객체 접근

    • question.choice_set.create(...): Question 객체에 대한 Choice 객체 추가


  • Django는 글로벌 웹서비스 프레임워크이기 때문에 datetime 대신 timezone을 사용해 현재 시각 구함

    from django.utils import timezone
    now = timezone.now()

  • 레코드 생성하기

    • obj.save(): Django shell에서 생성한 객체를 모델에 저장

    • DateTimeField(auto_now_add = True): 객체가 처음 생성된 시각 자동 저장

    • DateTimeField(auto_now = True): 객체가 갱신될 때마다 현재 시각 자동 저장

  • 레코드 수정 및 삭제하기

    • 수정

      obj.field = new_field
      
      obj.save()

    • obj.delete(): 삭제

  • 모델 필터링(Model Filtering)

    • get()은 조건에 맞는 데이터 하나만 가져오고, filter()는 조건에 맞는 데이터를 모두 가져옴

    • filter()는 객체가 담긴 QuerySet 반환

    • obj.query: 실행되는 쿼리문

    • Obj.objects.get(id = 1): id로 검색

    • Obj.objects.get(field__startswith = '...'): 텍스트 타입의 필드가 특정 문자(열)로 시작하는 데이터 검색

    • Obj.objects.filter(datetimeField__year = 2023): datetime 타입의 필드가 특정 연도를 갖는 데이터 검색

    • Obj.objects.filter(field__contains = '...'): 텍스트 타입의 필드가 특정 문자(열)를 포함하는 데이터 검색

    • Obj.objects.filter(intField__gt = 3): 정수 타입 필드의 값이 특정값 이상인 데이터 검색

    • Obj.objects.filter(field__contains = '...').update(field): 필터링된 데이터 갱신

    • Obj.objects.filter(field__contains = '...').delete(): 필터링된 데티어 삭제

    • Obj.objects.filter(field__regex = r'정규표현식'): 정규표현식 형태의 데이터 검색

    • Obj.objects.exclude(field__contains = ''): 텍스트 타입의 필드가 특정 문자(열)를 포함하는 데이터는 제외하고 검색

    • 여러 개의 필터를 중첩해서 사용 가능

      • Obj.objects.filter(A).filter(B)

    • https://docs.djangoproject.com/en/4.2/ref/models/querysets/#field-lookups

      • 해당 Django 공식 문서에서 다양한 필터의 사용법 확인 가능

메모


  • 터미널에서 명령어 실행 시 아무런 반응이나 메시지가 없을 경우, 대부분 제대로 실행된 것

  • 에러 발생 시 메시지 자세히 읽어보기

0개의 댓글