TIL) 데브코스 11일차 - Django(1)

Pori·2023년 10월 30일
0

데엔

목록 보기
6/47

개발 환경 설치하기.

py -m venv my_project
# 프로젝트가 정상적으로 설치되면.
project-name\Scripts\activate.bat # 을 통해서 실행
deactivate #로 가상환경 비활성화
  • Django 설치
py -m pip install Django
# 체크
django-admin –version

Django 프로젝트 생성과 실행

  • 생성
$ django-admin startproject mysite
  • 실행
$ python manage.py runserver

앱 생성하기

  • poll 라는 이름의 앱을 생성하기
$ python manage.py startapp polls
  • url 추가하기
    • polls 폴더안에 urls.py 파일을 생성해준다.

    • path를 정의한다

      1. polls/urls.py에 urls의 기본 코드를 입력 후 원하는 형식에 맞추어 변경해준다.
        views.index를 보게 할 것이기 때문에 다음과 같이 변경했다.

        from django.urls import path
        
        urlpatterns = [
            path("", views.index, name = 'index'),
        ]
      2. mysite/urls.py에 path추가 하기.

        from django.contrib import admin
        from django.urls import path, include #기본 구조에 include를 추가로 import
        
        urlpatterns = [
            path('polls/', include('polls.urls')), #polls/ 에 대한 path추가
            path("admin/", admin.site.urls),
        ]
    • views.index 생성하기.

      # polls\views
      from django.http import HttpResponse
      
      def index(request):
          return HttpResponse("Hello world.")
      # polls\urls
      from . import views # 추가
  • 이제 url를 찾아서 확인을 해보면 다음과 같이 나오게 된다. http://127.0.0.1:8000/polls/

모델 만들기

  • 모델은 DB를 테이블별로 읽어서 하나의 테이블에 저장된 값을 코드에서 읽도록 도와준다 (ORM)
  1. 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)
  1. 모델을 테이블에 사용하기 위한 마이그레이션 생성
    마이그레이션 생성을 위해 다음과 같은 작업들이 필요하다.
    1. mysite/settings.py의 INSTALLED_APPS 수정 : 이곳에 polls.apps의 class값을 추가해야 한다.

    2. migration 파일 생성 $ python manage.py makemigrations polls

    3. migration 실행 $ python manage.py migrate id 컬럼이 자동생성된다. → 인덱싱을 위해 사용
        
  • 만들어진 테이블 확인하기./mysite/sqllite3 db.sqllite3 를 통해 db에 접근하여 테이블 확인이 가능하다.
  • 되돌리기 : python manage.py migrate polls 0001 를 사용해서 이전 버전으로 마이그레이션을 되돌리는 것이 가능하다. → 마이그레이션을 기록을 참고해야한다. → 버전을 돌린 후에 마이그레이션을 지우면 된다. /polls/migrations + 모델에서 생성한 필드들을 제거해야한다.

참고

Django Admin

관리자 계정 생성하고 접속하기.

  • admin계정 만들기 : python manage.py createsuperuser 를 통해 계정만들기를 시작할 수 있다.
  • 로그인하는 법.
    - 서버 실행 후 /admin으로 접속한다.

모델 등록하기

  • /polls/admin.py에 원하는 모델을 등록해주어야 한다.
# /polls/admin.py
from .models import *
admin.site.register(Question)

  • 그 결과 다음과 같이 나오게 된다.
  • question object 대신 이름을 사용하고 싶은 경우 각 클래스에 str을 설정해주어야하는데 코드 예시는 다음과 같다.
# /polls/models.py
class Question(models.Model):
	question_text = models.CharField(max_length=200)
	...
	def __str__(self):
		return self.question_text # 또는 str 값으로 리턴해도 가능하다.

Django Shell

  • 실행 : python [manage.py](http://manage.py) shell

모델 접근

  1. import 하기 : 원하는 모델을 우선 가져온다. 예시) from polls.models import *
  2. object 가져오기. Model.objects.all() 의 형태로 오브젝트를 가져올 수 있으며, 변수에 할당 가능하다.
  3. object 안에서의 참조 : ForeignKey 가 있는 경우 해당 키를 통해서 연결된 다른 테이블의 값도 가져올 수 있다. 그러나 ForeignKey가 없는 경우에는 model.sub_model_set.all() 처럼 _set을 사용해서 가져와야 한다.

현재 시간 구하기

  • TimeZone이 필수적으로 들어가야한다.
# timezone을 활용하여 현재 시간 구하기
from django.utils import timezone
timezone.now()
# => datetime의 형태로 출력되며, tzinfo가 붙어서 나오게 된다.

레코드 생성하기

: shell을 통해서 레코드를 생성하는 방법

예제) Question테이블을 Choice 테이블이 참조한다.

  1. 상위 테이블에서 하위 테이블을 따라가면서 생성
# 1. save를 이용
q = Question(question_text = '테스트 레코드')
q.save() # save를 하지 않으면 db에 적재되지 않는다, 메모리에만 존재
# 필수인 값을 넣어주지않으면 에러가 발생한다.
# 값을 추가하는 방법은 다음과 같다.
q.pub_date = timezone.now() # 이러한 방법

# 2.create를 이용
q.choice_set.create(choice_text='a')
# 이 경우에 db에 바로 적재된다.

# 참고로 model의 field 인자에 auto_now_add를 입력하면 생성 시간을 자동으로 입력 가능하다.
  1. 하위테이블에서 ForeignKey값을 붙여서 레코드를 생성
choice_c = Choice(choice_text='c',question=q)
choice_c.save()

레코드 수정 및 삭제

  • 수정 : 수정은 해당 인자의 값을 받아 수정을 거친 후 save()를 활용하여 db에 연동시킨다.
  • 삭제 : 지우고자 하는 값을 가져온 후 .delete()를 사용하여 제거한다. db에 바로 연동된다.
    연결되어 있는 기존의 모든 오브젝트를 제거하는 경우 _set.delete() 처럼 _set을 같이 사용한다.

모델 필터링

  • 조건에 맞는 값 1개를 가져오고 싶은 경우 .get() 메서드를 사용한다.
  • 여러개의 쿼리셋을 가져오고 싶은 경우 .filter() 메서드를 사용한다.
  • 각 인자의 상세값은 __조건 을 통해서 가져올 수 있는데 예시 몇가지를 본다면 다음과 같다.
# question_text가 a로 시작하는 값
Question.objects.get(question_text__startwith='a') 
# a가 포함된 값을 찾으면
Question.objects.get(question_text__contains='a') 
# 보다 큰 값은 __gt
# 특정 시간으로 필터링
Question.objects.filter(pub_date__second=25)
# 이것을 쿼리문으로 변경해서 보고싶다면 다음과 같이 사용한다. .query 사용
q = Question.objects.get(pk=1)
print(q.choice_set.all().query)

: 조건들은 docs의 QuerySet method refernce를 참고한다. QuerySet method reference

  • 추가로 조건에 맞는 값들 뒤에 .update() 를 이용해서 값을 업데이트 할 수 있으며, delete도 가능하다.
  • filter 또한 여러번 걸 수 있다.
  • regex : 정규 표현식 ⇒ 대상이 정규표현식을 만족하는 경우 필터링 가능하다.
    정규표현식 참고 : https://hamait.tistory.com/342
# 코드 예시
q= Question(question_text = '휴가 계획이 있나요?")
q.save()

# 정규 표현식을 이용해서 '휴가'가 처음에 오고 '어디'라는 단어가 오는 값만 필터링한다.
Question.objects.filter(question_text__regex=r'^휴가.*어디')

관계 기반 필터링

  • 제외하고 필터링하고 싶은 경우에는 filter 대신 exclude() 메서드를 사용한다.
  • foreignkey를 갖는 경우에 그 테이블의 속성을 참조해서 필터링을 걸 수 있다.
Choice.objects.filter(question__question_text__startswith='휴가')
Choice.objects.exclude(question__question_text__startswith='휴가')

모델 메서드

  • 추가 : models에 있는 각 클래스에 메서드를 추가해주면 된다. 기존 파이썬 메서드 방식과 동일하다.

에러 모음

SQLite does not support JSONFields 에러 해결 : https://thefirstperson.tistory.com/172

공부 한 내용

  • Django 설치 및 실습
  • 모델 생성과 shell 사용법에 대한 이해

새롭게 배운 내용

  • Django..
  • 각 메서드들

느낀점&참고

: 양이 많아서 정리가 까다로웠다. Django를 통해서 쉽게 서버를 열 수 있겠구나 생각했다.

0개의 댓글