[프로그래머스] 데브코스 데이터엔지니어링 TIL Day 11

주재민·2023년 10월 30일
0
post-thumbnail

📖 학습주제

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


가상환경 설정

가상환경 생성

파이썬을 설치한 후 cmd창을 통해 진행한다.

py -m venv project-name

기존에 프로젝트 폴더가 존재하지 않았던 경우에는 설정한 프로젝트 이름에 따라 새롭게 폴더가 생성된다.

가상환경 활성화

project-name\Scripts\activate.bat

Django 설치

py -m pip install Django

Django Project 생성

새로운 Django 프로젝트 생성하기

mysite라는 프로젝트를 생성한다.

django-admin startproject mysite

생성한 프로젝트를 서버에서 실행하기

python manage.py runserver

실행한 서버로 가보자

Django App 생성하기

polls 앱 생성하기

python manage.py startapp polls

polls가 생긴 것을 볼 수 있다.

웹 서버가 페이지를 내리려면 url이 필요하다. 존재하지 않는 url을 요청하게 되면 에러가 나는 것을 볼 수 있다.

장고 서버에게 url을 가르쳐보자.
mysite의 urls.py를 보면 url 패턴을 가지는 것을 알 수 있다.
(admin/이라는 패턴이 들어오면 그 뒤로 보내라)

이와 같이 polls에 urls.py를 만들어보자

polls/urls.py

from django.urls import path

urlpatterns = [
    path('',views.index, name='index')
]

이렇게 정의된 polls에 정의되어 있고 아직 mysite에서 작동될 수 있도록 설정하지 않았다. 그러므로 mysite의 urls.py을 다음과 같이 수정한다.

from django.contrib import admin
from django.urls import path, include    #include 사용을 위해

urlpatterns = [
    path("admin/", admin.site.urls),
    path("polls/", include('polls.urls'))
]

또한 polls의 urls.py에서 아무것도 입력되지 않으면 views.index에서 처리하도록 되어 있으므로 이번에는 polls의 views.py에서 views.index를 만들자.

polls/views.py

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world.")

이번에는 polls의 urls.py에서 views를 이용할 수 있도록 다음과 같이 고쳐주자

from django.urls import path
from . import views

urlpatterns = [
    path('',views.index, name='index')
]

모델 만들기

웹페이지는 DB의 정보를 읽어서 화면에 표시하게 된다. 장고에서는 모델이 이런 역할을 해 DB를 테이블별로 읽어서 테이블에 저장된 값을 코드로 읽을 수 있게 해준다.
다음의 절차를 통해 간단한 설문에 답을 하는 모델을 만들어보자.

  1. 모델 생성
  2. 모델을 테이블에 써주기 위한 마이그레이션 생성
  3. 모델에 맞는 테이블 생성

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')

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

질문 내용과 질문을 생성한 날짜로 이루어진 Question 모델과 선택지와 받은 투표 수로 이루어진 Choice 모델을 만들었다.

마이그레이션을 만드는 장고의 기능은 설치된 앱에 만들기 때문에 settings.pyINSTALLED_APPS에 polls를 추가한다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'polls.apps.PollsConfig',
]

cmd 창을 열어 migration 파일을 생성하자

migration 파일 생성하기

python manage.py makemigrations polls

migration으로 실행될 SQL 문장 살펴보기

python manage.py sqlmigrate polls 0001

migration 실행하기

python manage.py migrate

Django Admin

admin 페이지 : 일반적으로 시스템을 관리하는 관리자들이 데이터를 추가하거나 수정하는 페이지

Django Admin - 관리자 계정 생성하고 접속하기

Django Admin(관리자) 계정 생성하기

python manage.py createsuperuser

위에서 urls.py에 아래와 같은 코드를 봤을 것이다.

path("admin/", admin.site.urls)

url 뒤에 admin을 붙이면 접속이 가능하다.

Django Admin - 모델 등록하기

admin.site.register()를 이용해서 모델을 등록할 수 있다.

polls/admin.py

from django.contrib import admin
from .models import *

#Register your models here
admin.site.register(Question)
admin.site.register(Choice)

def __str__(self)을 이용해서 우리에게 보여지는 글자를 바꿀 수 있다.

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 __str__(self):
        return f'제목: {self.question_text}, 날짜: {self.pub_date}'

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

Django Shell

Django Shell 사용하기

Django Shell 실행하기

python manage.py shell

models.py 파일에 정의된 모든 모델 가져오기

>>> from polls.models import *
>>> Question

모든 Question,Choice 오브젝트 가져오기

>>> Question.objects.all()
>>> Choice.objects.all()

첫번째 Choice 오브젝트 가져오기

>>> choice = Choice.objects.all()[0]
# 각 필드에 접근 가능 
>>> choice.id
>>> choice.choice_text
>>> choice.votes

첫번째 Choice와 연결된 Question 가져오기

# question이 ForeignKey로 정의 되어 있어 접근 가능
>>> choice.question
>>> choice.question.pub_date
>>> choice.question.id

해당 Question과 연결되어 있는 모든 Choice 가져오기

>>> question.choice_set.all()

현재 시간 구하기

datetime을 활용하여 현재 날짜와 시간 구하기

>>> from datetime import datetime
>>> datetime.now()

timezone을 활용하여 현재 날짜와 시간구하기

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

레코드 생성하기

>>> from polls.models import *

#"커피 vs 녹차" 라는 내용의 새로운 Question 오브젝트를 생성하고 'q1'이라는 변수에 저장하기
>>> q1 = Question(question_text = "커피 vs 녹차")

#tiemzone을 활용하여 새로운 오브젝트 'q1'의 생성시각을 설정하기
>>> from django.utils import timezone
>>> q1.pub_date = timezone.now()

#새로운 Question 오브젝트 'q1'을 데이터베이스에 저장하기
>>> q1.save()

>>> q3 = Question(question_text = "abc")
>>> q3.pub_date = timezone.now()
>>> q3.save()
> 
#create() 메서드를 활용하여 q3와 연결된 새로운 Choice 오브젝트를 생성하고, choice_text 필드에 값을 넣어주기
>>> q3.choice_set.create(choice_text = "b")

#새로운 Choice 오브젝트를 생성하고 question 필드에 q3 값을 넣어 연결하기
>>> choice_c = Choice(choice_text='c', question=q3)

#새로운 Choice 오브젝트를 데이터베이스에 저장하기
>>> choice_c.save()

레코드 수정 및 삭제 하기

>>> from polls.models import *

#Question 오브젝트 중 가장 마지막으로 만들어진 것을 가져오기
>>> q = Question.objects.last()

#해당 오브젝트의 question_text에 새로운 내용을 더해 수정하기
>>> q.question_text = q.question_text + '???'

#Choice 오브젝트 중 가장 마지막으로 만들어진 것을 가져오기
>>> choice = Question.objects.last()

#해당 오브젝트에 연결된 Question을 통해서 choice set을 가져오기
>>> choice.queston.choice_set.all()

#해당 오브젝트를 삭제하기
>>> choice.delete()

모델 필터링(Model Filtering)

  • get() : 조건에 해당하는 오브젝트 하나를 필터링
model.objects.get(condition)
  • filter() : 조건에 해당하는 오브젝트를 모두 필터링
model.objects.filter(condition)

https://docs.djangoproject.com/en/4.2/ref/models/querysets/ 의 오른쪽에 Field lookups에서 필터링에 사용되는 조건들을 볼 수 있다.

0개의 댓글