py -m venv my_project
# 프로젝트가 정상적으로 설치되면.
project-name\Scripts\activate.bat # 을 통해서 실행
deactivate #로 가상환경 비활성화
py -m pip install Django
# 체크
django-admin –version
$ django-admin startproject mysite
$ python manage.py runserver
$ python manage.py startapp polls
polls 폴더안에 urls.py 파일을 생성해준다.
path를 정의한다
polls/urls.py에 urls의 기본 코드를 입력 후 원하는 형식에 맞추어 변경해준다.
views.index를 보게 할 것이기 때문에 다음과 같이 변경했다.
from django.urls import path
urlpatterns = [
path("", views.index, name = 'index'),
]
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 # 추가
# 질문에 대한 선택을 하는 모델을 생성했다.
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)
$ python manage.py makemigrations polls
$ python manage.py migrate
id 컬럼이 자동생성된다. → 인덱싱을 위해 사용
/mysite/sqllite3 db.sqllite3
를 통해 db에 접근하여 테이블 확인이 가능하다.python manage.py migrate polls 0001
를 사용해서 이전 버전으로 마이그레이션을 되돌리는 것이 가능하다. → 마이그레이션을 기록을 참고해야한다. → 버전을 돌린 후에 마이그레이션을 지우면 된다. /polls/migrations + 모델에서 생성한 필드들을 제거해야한다.참고
- 마이그레이션이란?
: 장고에서의 마이그레이션은 모델의 변경 내역을 DB 스키마에 적용시키는 방법이라 한다.
참고링크 : https://tibetsandfox.tistory.com/24- CASCADE : https://velog.io/@byoungju1012/TIL29.-ondelete-옵션
- 다양한 모델 필드 활용하기 (DOCS) : https://docs.djangoproject.com/en/4.2/ref/models/fields/
python manage.py createsuperuser
를 통해 계정만들기를 시작할 수 있다.# /polls/admin.py
from .models import *
admin.site.register(Question)
# /polls/models.py
class Question(models.Model):
question_text = models.CharField(max_length=200)
...
def __str__(self):
return self.question_text # 또는 str 값으로 리턴해도 가능하다.
python [manage.py](http://manage.py) shell
from polls.models import *
Model.objects.all()
의 형태로 오브젝트를 가져올 수 있으며, 변수에 할당 가능하다. model.sub_model_set.all()
처럼 _set을 사용해서 가져와야 한다.# timezone을 활용하여 현재 시간 구하기
from django.utils import timezone
timezone.now()
# => datetime의 형태로 출력되며, tzinfo가 붙어서 나오게 된다.
: shell을 통해서 레코드를 생성하는 방법
예제) Question테이블을 Choice 테이블이 참조한다.
# 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를 입력하면 생성 시간을 자동으로 입력 가능하다.
choice_c = Choice(choice_text='c',question=q)
choice_c.save()
save()
를 활용하여 db에 연동시킨다..delete()
를 사용하여 제거한다. db에 바로 연동된다._set.delete()
처럼 _set
을 같이 사용한다.__조건
을 통해서 가져올 수 있는데 예시 몇가지를 본다면 다음과 같다.# 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도 가능하다.# 코드 예시
q= Question(question_text = '휴가 계획이 있나요?")
q.save()
# 정규 표현식을 이용해서 '휴가'가 처음에 오고 '어디'라는 단어가 오는 값만 필터링한다.
Question.objects.filter(question_text__regex=r'^휴가.*어디')
filter
대신 exclude()
메서드를 사용한다.Choice.objects.filter(question__question_text__startswith='휴가')
Choice.objects.exclude(question__question_text__startswith='휴가')
SQLite does not support JSONFields 에러 해결 : https://thefirstperson.tistory.com/172
: 양이 많아서 정리가 까다로웠다. Django를 통해서 쉽게 서버를 열 수 있겠구나 생각했다.