py -m venv project-name
명령어 실행project-name\Scripts\activate.bat
명령어로 가상환경 활성화py -m pip install Django
명령어로 Django설치django-admin version
명령어로 설치확인django-admin startproject project-name
명령어로 장고 프로젝트 생성python manage.py runserver
명령어로 프로젝트 서버에서 실행python manage.py startapp polls(앱 이름)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world.")
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('some_url', views.some_url),
]
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world.")
def some_url(request):
return HttpResponse("Some URL")
장고의 모델은 DB를 테이블 별로 읽어서 하나의 테이블에 저장되어 있는 값을 코드에서 읽어줄 수 있도록 도와주고 이를 ORM이라 부름
모델 생성 → 모델을 테이블에 써주기 위한 마이그레이션 생성 → 이 모델에 맞는 테이블 생성
투표 구현
1. polls/models.py 수정
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200) # 텍스트 저장 필드(질문 내용)
pub_date = models.DateTimeField('data published') # 날짜 저장 필드(질문을 만든 날짜)
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE) # 외래키 Question을 CASCADE로 참조
choice_text = models.CharField(max_length=200) # 텍스트 저장 필드(질문에 대한 옵션들)
votes = models.IntegerField(default=0) # 숫자 저장 필드(투표 수)
INSTALLED_APPS = [
'polls.apps.PollsConfig', # 추가
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
cmd에서 python manage.py makemigrations polls
명령어 작성하여 polls라는 마이그레이션 파일 생성
python manage.py sqlmigrate polls 0001
명령어로 migration 내용 살펴보기
장고에서는 자동으로 테이블을 만들 때 id필드를 자동으로 생성
python manage.py migrate
명령어로 migration 실행
question모델에 필드를 추가하고 삭제하기
1. polls/models.py에 question 필드 추가
from django.db import models
class Question(models.Model):
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) # 추가
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
cmd에 sqlite3 db.sqlite3
명령어로 sql 실행
.tables
명령어로 table목록 확인
SELECT * FROM django_migrations
명령어로 로그 확인
맨 아래 새로운 polls|0002_question 확인 가능
.schema polls_question
명령어로 polls_question 스키마 확인
새로 추가한 average_score과 is_something 확인 가능
삭제를 진행하기 위해, .quit
를 작성하여 sqlite를 나가준 후 python manage.py migrate polls 0001
명령어로 0001버전으로 롤백
polls/models.py 수정 - is_something과 average_score 삭제
from django.db import models
class Question(models.Model):
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)
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 createsuperuser
명령어를 실행하고, 계정 이름과 이메일, 비밀번호 입력
http://127.0.0.1:8000/admin/에서 계정 이름과 비밀번호 입력
로그인을 하면 User를 추가하거나 관리하고 권한 설정 가능
from django.contrib import admin
from .models import *
# Register your models here.
admin.site.register(Question)
admin.site.register(Choice)
POLLS에서 Add 클릭
값 입력 후 Save
polls/models.py에서 Question에 대한 출력 양식 입력
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200) # 텍스트 저장 필드
pub_date = models.DateTimeField('data 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)
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200) # 텍스트 저장 필드
pub_date = models.DateTimeField('data published') # 날짜 저장 필드
score = models.FloatField(default=0) # 추가
is_somthing_wrong = models.BooleanField(default=False) # 추가
json_field = models.JSONField(default=dict) # 추가
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)
python manage.py shell
명령어로 Django Shell 열기
from polls.models import *
작성해주고 Question
실행
모델이름.objects.all()
명령어로 테이블 확인
Choice 레코드 추가
polls/models.py에서 Choice에 대한 출력 양식 설정
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200) # 텍스트 저장 필드
pub_date = models.DateTimeField('data 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 f"{self.choice_text}"
Choice 확인
Choice에 대한 여러 정보 확인, question 참조
question.choice_set.all()
명령어로 question에서 choice참조
Django에서는 datetime 대신에 timezone 사용
from django.utils import timezone
timezone.now()
모델 객체 생성
q1 = Question(question_text = "커피 vs 차", pub_date = time.zone())
DB에 객체 저장
q1.save()
polls/models.py에서 pub_date 옵션 변경
auto_now=True
: 모델이 갱신될때마다 현재 시각 정보 저장auto_now_add=True
: 모델이 생성될때 현재 시각 정보 저장class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField(auto_now_add=True)
모델 객체 생성
q2 = Question(question_text="abc")
DB에 객체 저장
q2,save()
choice_set.create 사용
q2.choice_set.create(choice_text='a')
혹은
choice_c = Choice(choice_text='c', question=q3)
choice_c.save()
수정
q.question_text = q.question_text + '???'
삭제
choice.delete()
get() : 조건에 해당하는 객체 1개만 출력
Question.objects.get(id=1)
Question.objects.get(question_text__startwith='a')
Question.objects.get(pub_date__year=2023)
filter() : 조건에 해당하는 객체 여러개 출력
Question.objects.filter(pub_date__year=2023)
Question.objects.filter(pub_date__year=2023).cout()
query
gt : 더 큰 조건들 출력
print(Choice.objects.filter(votes__gt=0).query)
update() : 레코드값 변경, 바뀐 레코드 반환
Choice.objects.filter(votes__gt=0).update(votes=0)
delete() : 레코드 삭제, 삭제된 레코드 반환
`Choice.objects.filter(votes=0).delete()
regex : 정규표현식을 만족하는 레코드 확인
exclude() : 조건에 해당되지 않는 레코드 확인
Question.objects.exclude(question_text__startswith='휴가')
polls.models.py에 메서드 추가
from django.db import models
# 추가
from django.utils import timezone
import datetime
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField(auto_now_add=True)
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
#추가
def __str__(self):
if self.was_published_recently():
new_badge = "NEW"
else:
new_badge = ''
return f"{new_badge} 제목: {self.question_text}, 날짜: {self.pub_date}"
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 f"[{self.question.question_text}]{self.choice_text}"
결과