2023/10/30

anso·2023년 10월 30일
0

TIL

목록 보기
8/20
post-thumbnail

개발 환경 설정

  1. cmd에 py -m venv project-name 명령어 실행
  2. project-name\Scripts\activate.bat 명령어로 가상환경 활성화
  3. py -m pip install Django 명령어로 Django설치
  4. django-admin version 명령어로 설치확인
  5. django-admin startproject project-name 명령어로 장고 프로젝트 생성
  6. python manage.py runserver 명령어로 프로젝트 서버에서 실행

Django App 생성

  1. 앱 생성
python manage.py startapp polls(앱 이름)
  1. mysite/urls.py의 코드 변경
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]
  1. polls폴더에 urls.py파일 생성 후 코드 작성
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
  1. polls/views의 코드 변경
from django.http import HttpResponse

def index(request):
  return HttpResponse("Hello, world.")

URL path설정

  1. polls/urls.py에서 some_url path 추가
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('some_url', views.some_url),
]
  1. polls/views.py에서 some_url view 추가
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)  # 숫자 저장 필드(투표 수)
  1. mysite/settings.py에서 APP추가
INSTALLED_APPS = [
    'polls.apps.PollsConfig', # 추가
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
  1. cmd에서 python manage.py makemigrations polls 명령어 작성하여 polls라는 마이그레이션 파일 생성
    python manage.py sqlmigrate polls 0001 명령어로 migration 내용 살펴보기
    장고에서는 자동으로 테이블을 만들 때 id필드를 자동으로 생성

  2. python manage.py migrate 명령어로 migration 실행

Django의 모델 필드 활용하기

  • BooleanField : boolean값 저장
  • CharField : 문자열 저장
  • DateField : 날짜만 저장
  • DateTimeField : 날짜와 시간 저장
  • FloatField : 실수 저장
  • JSONField : JSON형식으로 데이터 저장
  • TextField : Char보다 좀 더 긴 text 저장

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) 
  1. cmd에 sqlite3 db.sqlite3명령어로 sql 실행

  2. .tables 명령어로 table목록 확인

  3. SELECT * FROM django_migrations 명령어로 로그 확인
    맨 아래 새로운 polls|0002_question 확인 가능

  4. .schema polls_question 명령어로 polls_question 스키마 확인
    새로 추가한 average_score과 is_something 확인 가능

  5. 삭제를 진행하기 위해, .quit를 작성하여 sqlite를 나가준 후 python manage.py migrate polls 0001 명령어로 0001버전으로 롤백

  6. 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) 
  1. polls/migrations/0002_--.py 파일 삭제

Admin 계정 생성하고 접속

  • Admin페이지 : 시스템을 관리하는 관리자가 데이터를 추가하거나 수정하는 페이지
  • CRUD : Create, Read, Update, Delete
  1. python manage.py createsuperuser 명령어를 실행하고, 계정 이름과 이메일, 비밀번호 입력

  2. http://127.0.0.1:8000/admin/에서 계정 이름과 비밀번호 입력

  3. 로그인을 하면 User를 추가하거나 관리하고 권한 설정 가능

Admin 모델 등록하기

  1. polls/admin.py에서 모델 등록
from django.contrib import admin
from .models import *

# Register your models here.
admin.site.register(Question)
admin.site.register(Choice)
  1. POLLS에서 Add 클릭

  2. 값 입력 후 Save

  3. 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)
  1. 여러 필드 양식 입력
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)

Django Shell 사용하기

  1. python manage.py shell 명령어로 Django Shell 열기

  2. from polls.models import * 작성해주고 Question 실행

  3. 모델이름.objects.all() 명령어로 테이블 확인

  4. Choice 레코드 추가

  5. 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 확인

  1. Choice에 대한 여러 정보 확인, question 참조

  2. question.choice_set.all() 명령어로 question에서 choice참조

Django Shell에서 현재 시간 구하기

Django에서는 datetime 대신에 timezone 사용
from django.utils import timezone
timezone.now()

Django Shell에서 레코드 생성

모델 객체 생성 후 저장

  1. 모델 객체 생성
    q1 = Question(question_text = "커피 vs 차", pub_date = time.zone())

  2. DB에 객체 저장
    q1.save()

  3. 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)

저장되어 있는 모델 객체에서 생성

  1. 모델 객체 생성
    q2 = Question(question_text="abc")

  2. DB에 객체 저장
    q2,save()

  3. choice_set.create 사용
    q2.choice_set.create(choice_text='a')

혹은
choice_c = Choice(choice_text='c', question=q3)
choice_c.save()

Django Shell에서 레코드 수정 및 삭제

  • 수정
    q.question_text = q.question_text + '???'

  • 삭제
    choice.delete()

Django Shell 모델 필터링

  • 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='휴가')

Django Shell에서 모델 메서드 추가

  • .save() : DB에 레코드 추가
  • .delete() : DB에 레코드 삭제

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}"

결과

0개의 댓글