Django - 모델 만들기(설문조사 1)

윤형·2024년 9월 7일

Django

목록 보기
3/12

이제 본격적으로 장고에 대해서 공부를 해보고자 한다. 장고의 공식문서를 바탕으로 하나씩 따라하면서 장고에 익숙해지는 시간을 가져보도록 하겠다.

장고 공식 문서: https://docs.djangoproject.com/ko/5.1/intro/tutorial01/


프로젝트 만들기

django-admin startproject 이름

공식문서에 따라 디렉토리 이름은 mysite로 하겠다.


개발 서버

mysite디렉토리에 연결하고 명령어를 입력한다.

python3 manage.py runserver

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
September 07, 2024 - 10:28:56
Django version 4.2.16, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

다음과 같은 메세지가 출력된다면 성공 이제 우리는 로컬 서버를 열었다!


설문조사 개발

앱을 생성하기 위해 manage.py가 존재하는 디렉토리에서 다음의 명령을 입력한다.

python3 manage.py startapp polls(이름)

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

이러한 형태의 디렉토리 구조를 만들고 시작을 하겠다.


첫 번째 뷰 작성하기

"polls/views.py"를 열어 코드를 작성한다.

from django.http import HttpResponse

def index(requre):
	return HttpResponse("Hello World")

이것은 django의 가장 기본적인 view다.
이렇게 만들어진 뷰를 브라우저에서 엑세스 하기 위해서는 당연히 맵핑을 해야하고 이를 위해 URL Configuration 즉 "URLconf"를 정의해야 한다.

추가 정보) return시 ,(쉼표) 입력시 파이썬은 튜플로 인식하게 된다.

"polls/urls.py" 를 생성해준다.

from django.urls import path

from . import views

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

"mysite/urls.py" 부분은 아래와 같이 작성한다.

from django.contrib import admin
from django.urls import include,path

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

include() 함수는 다른 URLconf들을 참조할 수 있도록 도와준다.Django가 include()를 만나게 되면, URL의 그 시점까지 일치하는 부분을 잘라내고, 남은 문자열 부분을 후속 처리를 위해 include된 URLconf로 전달한다.

polls 앱에 그 자체의 URLconf(polls/urls.py)가 존재하는 한 그 어떤 다른 root 경로에 연결하더라도 앱은 잘 작동할 것이다.

💡) 다른 URL 패턴을 포함할 때마다 include()를 사용해야 한다! admin.site.urls가 유일한 예외다.

python3 manage.py runserver 입력시 잘 작동하는 모습을 볼 수 있다.



path()의 인수 - route
: route 는 URL 패턴을 가진 문자열 입니다. 요청이 처리될 때, Django 는 urlpatterns 의 첫 번째 패턴부터 시작하여, 일치하는 패턴을 찾을 때 까지 요청된 URL 을 각 패턴과 리스트의 순서대로 비교합니다.

패턴들은 GET 이나 POST 의 매개 변수들, 혹은 도메인 이름을 검색하지 않습니다. 예를 들어, https://www.example.com/myapp/ 이 요청된 경우, URLconf 는 오직 myapp/ 부분만 바라 봅니다. https://www.example.com/myapp/?page=3, 같은 요청에도, URLconf 는 역시 myapp/ 부분만 신경씁니다.

path() 의 인수 - view
: Django 에서 일치하는 패턴을 찾으면, HttpRequest 객체를 첫번째 인수로 하고, 경로로 부터 ‘캡처된’ 값을 키워드 인수로하여 특정한 view 함수를 호출합니다.

path() 의 인수 - name
:URL 에 이름을 지으면, 템플릿을 포함한 Django 어디에서나 명확하게 참조할 수 있습니다. 이 강력한 기능을 이용하여, 단 하나의 파일만 수정해도 project 내의 모든 URL 패턴을 바꿀 수 있도록 도와줍니다.


데이터베이스 설치

python3 manage.py migrate

명령어를 통해 데이터베이스 테이블을 생성하도록 한다. Django의 데이터베이스로 SQLite를 기본으로 사용된다.

모델 만들기

이제는 모델을 만들어야 한다.
"polls/models.py"로 이동해 코드를 작성한다.

import datetime
from django.db import models
from django.utils import timezone

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_data = models.DateTimeField("date published")
    def __str__(self):
        return self.question_text
    
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
  • CharField 는 문자(character) 필드를 표현하고, DateTimeField 는 날짜와 시간(datetime) 필드를 표현한다.

  • CharField 의 경우 max_length 를 입력해 주어야 한다. 이것은 데이터베이스 스키마에서만 필요한것이 아닌 값을 검증할때도 쓰인다.

모델 활성화

"mysite/setting.py" 에서

INSTALLED_APPS = [
    "polls.apps.PollsConfig", -> 추가됨
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
]

을 설정에 추가해 줘야 한다. 이제 장고는 Polls앱이 추가된 것을 알게 되었다.


모델을 정의한 후 데이터베이스와 동기화 작업을 해야한다.

python manage.py makemigrations - 변경사항 저장
python manage.py migrate - 실행

동기화가 완료되었으면 shell을 통해 API를 조작할 수 있다.

python3 manage.py shell

from polls.models import Choice, Question  # Import the model classes we just wrote.

# No questions are in the system yet.
>>> Question.objects.all()
<QuerySet []>

# Create a new Question.
# Support for time zones is enabled in the default settings file, so
# Django expects a datetime with tzinfo for pub_date. Use timezone.now()
# instead of datetime.datetime.now() and it will do the right thing.
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())

# Save the object into the database. You have to call save() explicitly.
>>> q.save()

# Now it has an ID.
>>> q.id
1

# Access model field values via Python attributes.
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc)

# Change values by changing the attributes, then calling save().
>>> q.question_text = "What's up?"
>>> q.save()

# objects.all() displays all the questions in the database.
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>

Django 관리자

관리자를 생성하기 위한 명령어를 입력해준다.

python3 manage.py createsuperuser

아이디와 비번을 입력하면 관리자 계정이 생성된 것이다.

manage.py을 실행시키고 도메인을 /admin/ 으로 이동하면

와 같은 모습을 볼 수 있다. 관리자 계정으로 로그인을 하면 데이터베이스 접근이 가능하게 된다.

"polls/admin.py"를 수정하여 원하는 모델의 관리 인터페이스를 알려준다.

from django.contrib import admin

from .models import Question

admin.site.register(Question)

이렇게 하면 원하는 데이터를 직접 관리할 수 있게 된것이다!!

profile
제가 관심있고 공부하고 싶은걸 정리하는 저만의 노트입니다.

0개의 댓글