[Django] Part 1: 모델(Models)

김서연·2024년 4월 8일

Django

목록 보기
2/8

1. Django Project 생성하기

mysite라는 프로젝트 생성

django-admin startproject mysite

서버 실행

  • manage.py: Django 프로젝트를 터미널에서 관리할 수 있도록 명령어를 제공하는 기능
python manage.py runserver

  • 서버 종료하기
    CTRL-C

2. Django App 생성하기

  • 프로그래머스 사이트 하나를 프로젝트라고 본다면, 커뮤니티처럼 포함되는 다양한 기능을 사이트를 구성하는 하나의 앱(App)이다
  • 앱은 하나의 프로젝트에만 속할 수 있는 것이 아니다

polls라는 이름의 Django App 생성하기

  • mysite라는 폴더 안으로 들어가 실행해야 하는 것 같다

    python manage.py startapp polls

polls 페이지에서 Hello World 출력하기

💡 우리가 연 서버 url에 polls라는 App을 만들고, 접속될 수 있도록 연결한 뒤 Hello, World를 출력하도록 한다.

  • django 서버에 잘못된 url로 요청을 보낼 경우

    sing the URLconf defined in mysite.urls, Django tried these URL patterns, in this order:

    • admin/
    → 요청한 페이지를 찾을 수 없었다. 필요한 url은 mysite.urls.py 에서 정의하면 된다!
  • mysite.urls.py 에서 polls와 연결해주기
    from django.urls import path, include
    
    urlpatterns = [
        # polls와 연결해주는 것
        # url에 polls/로 들어오면 그것에 대한 처리는 polls.urls에서 처리하도록!
        path('polls/', include('polls.urls')),
        path("admin/", admin.site.urls),
    ]
  • polls.urls.py 에서 접속할 경우 보일 페이지를 views에서 처리하도록 하기
    from django.urls import path
    from . import views
    urlpatterns = [
        # 아무것도 안 붙어 들어오면 views.index에서 처리하라
        path('', views.index, name='index')
    ]
  • polls.views.py 에서 Hello, World가 출력될 수 있도록 만들기
    from django.http import HttpResponse
    
    def index(request):
        return HttpResponse("Hello, world.")

3. URL 경로(path) 설정하기

💡 polls 하위에 some_url 이라는 페이지를 띄우기 위해 경로 설정하기

  • polls/urls.py
    from django.urls import path
    from . import views
    
    urlpatterns = [
        # 아무것도 안 붙어 들어오면 views.index에서 처리하라
        path('', views.index, name='index'),
        # some_url이 붙어 오면 views.some_url에서 처리하라
        path('some_url', views.some_url)
    ]
    
  • polls/views.py
    from django.http import HttpResponse
    
    def index(request):
        return HttpResponse("Hello, world.")
    
    def some_url(request):
        return HttpResponse("Some url을 구현해 봤습니다.")

4. 모델(Model) 만들기

  • 웹 페이지의 정보는 DB에 저장되어 있고, 이를 읽어들인다
  • 서버가 DB에서 데이터를 가져오는 것을 모델이라고 한다
  • 모델은 DB를 테이블별로 읽어서 하나의 테이블에 저장되어 있는 값을 코드에서 읽을 수 있도록 돕는다 → ORM이라고도 한다
  1. 모델 생성 (question, choice)

    • polls.model.py
    # 질문들을 저장
    class Question(models.Model):
        # 질문 (최대 길이 200)
        question_text = models.CharField(max_length=200)
        pub_date = models.DateTimeField('date published')
    
    # 각 옵션을 저장
    class Choice(models.Model):
        # 각 옵션(choice)은 질문에 딸려있는 것.. -> question을 FK로
        question = models.ForeignKey(Question, on_delete=models.CASCADE)
        # 선택한 텍스트 (최대 길이 200)
        choice_text = models.CharField(max_length=200)
        # 투표한 번호
        votes = models.IntegerField(default=0)
  1. migration 파일 생성하기

    서버에서 migration 이란?

    • 데이터베이스 스키마를 변경하거나 업데이트하는 프로세스
    • 설치된 app에 따라 migration 만들기
      • mysite.setting.py
    ```python
    INSTALLED_APPS = [
        "polls.apps.PollsConfig",
        ...
        ]
    ```
    • cmd 창에서 파일 생성하기
      • polls라는 이름으로 모델의 변경사항을 담은 migration 파일
    $ python manage.py makemigrations polls

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

    $ python manage.py sqlmigrate polls 0001

    • question의 id를 갖고 choice를 많이 탐색하게 될 것
    • indexing이 되어있지 않다면 db는 테이블을 풀스캔해야한다 → 자원 낭비
    • FK에는 indexing을 해야 빠르게 찾을 수 있다
  3. migration 실행하기

    • migration을 실행해 변경된 내용을 데이터베이스에 적용
    $ python manage.py migrate

    더 돌리면 더이상 실행할 migration이 없다고 한다

    • 나는 polls만 했는데 왜 다른 것들(admin 등)도 뜨는가?
      • 기존에 세팅되어 있던 것들

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

🔗 django 공식 document
https://docs.djangoproject.com/en/5.0/

자주 사용되는 Field

  • BooleanField
  • CharField
  • DateField: 날짜만 저장 (시간 X)
  • DateTimeField: 날짜 + 시간
  • FloatField
  • JSONField
  • TextField: char보다 긴 것

테스트 필드 추가하기

  • polls/models.py 수정
    # 질문들을 저장
    class Question(models.Model):
        # 질문 (최대 길이 200)
        question_text = models.CharField(max_length=200)
        pub_date = models.DateTimeField('date published')
        # 테스트용 임시 필드
        is_something = models.BooleanField(default=False)
        average_score = models.FloatField(default=0.0)
  • migration 파일을 만들고 실행하기
    • python manage.py makemigrations
    • python manage.py migrate

SQLite3 터미널에 접속해 스키마 확인하기

  • sqlite3 터미널 접속
    sqlite3 db.sqlite3
  • django_migrations 테이블 살펴보기
    SELECT * FROM django_migrations

  • polls_question 스키마 살펴보기
    .schema polls question

  • .exit : sqlite 터미널 종료

테스트로 추가한 필드 삭제하기

  • 테스트용으로 추가한 필드를 삭제하는 것은 마지막 마이크레이션을 취소하고 돌아가는 것과 같다

  • 마이그레이션 0001 버전으로 롤백

    python manage.py migrate polls 0001


  • sqlite3 터미널에서 스키마 확인하기


  • vscode 상에서 0002 마이그레이션 파일 지우기

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

  • admin 페이지: 일반적으로 시스템 관리자들이 데이터를 추가하거나 수정하는 페이지
  • django는 개발자가 하나하나 만들어주기보다 우리가 만든 모델을 기반으로 데이터를 만들고 읽고 업데이트하고 지우고는 기능을 지원한다
    • CRUD: Create, Read, Update, Delete

어드민에 접속할 수 있는 사용자 만들기

python [manage.py](http://manage.py/) createsuperuser

어드민에 접속하기

  • 사이트 url 맨 뒤에 /admin이라고 추가하면 접속할 수 있다

웹 상에서 새로운 superuser, admin2 만들기

admin2 설정 수정해 superuser로 만들기

7. Django Admin - 모델 등록하기

모델 등록하기

  • polls/admin.py
    from django.contrib import admin
    from .models import *
    
    # Register your models here.
    admin.site.register(Question)
    admin.site.register(Choice)
    브라우저 상에서 잘 등록된 것을 볼 수 있다

웹 상에서 model object 만들기

코드상으로 등록했던 필드대로 question object를 만들 수 있다

question object 제목을 다르게 보이도록 수정

  • __str__() 로 수정할 수 있다

  • question로 보이게

    # 질문들을 저장
    class Question(models.Model):
        # 질문 (최대 길이 200)
        question_text = models.CharField(max_length=200)
        pub_date = models.DateTimeField('date published')
    
        # 자기 자신을 문자열로 표현할 때 어떻게 표현할 것인가?
        # question을 문자열로 표현할 때 question_text를 보이라는 것
        def __str__(self):
            return self.question_text

  • question + pub_date로 보이게
    def __str__(self):
            return f"제목: {self.question_text}, 날짜: {self.pub_date}"

테스트용 field 추가

  • float, boolean, json field 추가
    # 질문들을 저장
    class Question(models.Model):
        # 질문 (최대 길이 200)
        question_text = models.CharField(max_length=200)
        pub_date = models.DateTimeField('date published')
        
        score = models.FloatField(default=0)
        is_something_wrong = models.BooleanField(default=False)
        json_field = models.JSONField(default=dict)
    
        # 자기 자신을 문자열로 표현할 때 어떻게 표현할 것인가?
        # question을 문자열로 표현할 때 question_text를 보이라는 것
        def __str__(self):
            return f"제목: {self.question_text}, 날짜: {self.pub_date}"
    
  • migration 파일 만들고 업데이트하기
  • 웹에서 확인하기
  • 0001으로 롤백하기
    • model.py 에서 추가했던 코드, migration 파일 삭제
profile
가보자고! 🔥

0개의 댓글