관리 메뉴

Storage Gonie

23. (app2) Django Shell로 Model 조작하기1 본문

웹개발/Django 웹서비스 개발(인프런)

23. (app2) Django Shell로 Model 조작하기1

Storage Gonie 2019. 2. 17. 17:38
반응형

1. Shell 실행

- "python manage.py shell"


2. 두 모델 import

- "from polls.models import Question, Choice"


3. 잠시 후 사용할 메소드 import

- "from django.utils import timezone"


4. 모델의 오브젝트 생성

- "q = Question(question_text = "최고의 고기는?", pub_date = timezone.now())"


5. 생성한 오브젝트를 데이터베이스에 저장 

- "q.save()"


6. 생성한 오브젝트의 속성 접근

- "q.id"                                                   -> 1 

- "q.pub_date"                                       -> 최고의 고기는?

- "q.question_text"                                -> datetime.datetime(2019, 2, 17, 8, 48, 11, 723161, tzinfo=<UTC>)


7. 특정 모델의 모든 오브젝트 가져오기

- "Question.objects.all()"                        -> <QuerySet [<Question: Question object>]>


7-1. 특정 모델의 모든 오브젝트 가져오기, 객체의 내용 으로 출력되게 하기

- 각 모델의 메소드에 __str__() 메소드 추가

from django.db import models

# Create your models here.

class Question(models.Model):
question_text = models.CharField(
max_length = 200)
pub_date = models.DateTimeField(
'date published') # ( ) 에 들어간 텍스트는 그냥 주석이다.

# 객체를 그대로 출력할 때 객체의 내용을 보여주도록 오버라이딩
def __str__(self):
return self.question_text

class Choice(models.Model):
# Foeign Key 설정, on_delete 설정 : 참조한 키가 삭제되면 그 키와 관련된 데이터를 같이 삭제해주세요
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(
max_length = 200)
votes = models.IntegerField(
default = 0)

# 객체를 그대로 출력할 때 객체의 내용을 보여주도록 오버라이딩
def __str__(self):
return self.choice_text


7-2. 메소드 추가 후 특정 모델의 모든 오브젝트 가져오기의 바뀐 결과

- "Question.objects.all()"                        -> <QuerySet [<Question: 최고의 고기는?>]>


8. 객체 복수검색

- "Question.objects.filter(id=1)"                   -> <QuerySet [<Question: 최고의 고기는?>]>

- filter를 이용한 결과는 여러개가 나올 수 있으며, 리스트의 형태로 감싸진 결과가 나온다. 따라서 아래와 같이 인덱스로 접근할 수 있다.

- "Question.objects.filter(id=1)[0]"              -> <Question: 최고의 고기는?>

- "Question.objects.filter(pk=1)[0]"             -> <Question: 최고의 고기는?>

- id는 pk와 같다.


8-1. filter와 startswith를 아용한 객체 복수검색

- Question.objects.filter(question_text__startswith = '최')    -> <QuerySet [<Question: 최고의 고기는?>]>

- 위의 입력에 대한 결과는 question_text이 '최'로 시작하는 객체들을 반환해준다.


9. 모델의 메소드 호출해보기

- Question모델에 다음의 모듈 및 메소드를 추가해준다.

- 다음의 메소드는 객체가 최근에 갱신되었는지 아닌지를 알 수 있다.

from django.utils import timezone
import datetime

# 객체가 가지고 있는 날짜 >= 하루전의 시간(어제)라면 True
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1) # 어제 = (현재시간 - 하루)


9-1. 모델의 메소드 호출해보기

-  "q.was_published_recently()"                     -> True


반응형
Comments