[파이썬][라이브러리] Django 공식문서 - 8
[출처 : 장고 공식문서]
API 가지고 놀기
-
쉘을 통해 장고의 API를 자유롭게 가지고 놀아보자
$ python manage.py shell
- 쉘에 진입한 이후에는 데이터베이스 API를 사용할 수 있게 된다.
- 영문의 내용을 직역한 것이므로 약간 이상할수도 있습니다!
>>> from polls.models import Choice, Question # 방금 만든 모델의 클래스를 불러온다. # 아직 작성한 질문이 없으므로 아무것도 없는 쿼리가 뜰 것이다. >>> Question.objects.all() <QuerySet []> # 새 질문을 작성한다. # 기존 설정 파일에서 시간대가 활서화되어 있으므로 # 장고에서는 pub_date에 대한 datetime을 통해 timezone을 사용한다. # 이렇게 해야 datetime.datetime.now()가 제대로 작동하게 된다. >>> from django.utils import timezone >>> q = Question(question_text="What's new?", pub_date=timezone.now()) # 객체를 데이터베이스에 저장한다. 이떄 save() 함수를 사용해준다. >>> q.save() # 이제 ID가 생성되었다. >>> q.id 1 # 파이썬 속성을 통해 모델 필드값에 엑서스한다. >>> q.question_text "What's new?" >>> q.pub_date datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>) # 속성을 변경한 다음 save()를 호출하여 값을 변경해준다. >>> q.question_text = "What's up?" >>> q.save() # objects.all()를 통해 데이터베이스의 모든 질무늘 표시해준다. >>> Question.objects.all() <QuerySet [<Question: Question object (1)>]>
- 쉘에 진입한 이후에는 데이터베이스 API를 사용할 수 있게 된다.
기존 model 파일 수정해주기
현재 위치는 polls/models.py
import datetime
from django.db import models
from django.utils import timezone
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
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 self.choice_text
- 기존의 models 파일에서 str() 메소드를 추가하는 것은 객체의 표현을 대화식 프롬프트에서 편하게 보려는 이유오아 장고가 자동으로 생성하는 관리 사이트에서도 객체의 표현이 사용되기 때문이다.
import datetime
대신 장고의 시간대 관련 유틸리티인django.utils.timezone
를 추가해준다.
변경사항 반영후 다시
>>> from polls.models import Choice, Question
# __str__() 함수가 작동하는지 확인한다.
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>
# 장고는 전적으로 구동되는 풍부한 데이터베이스 검색 API를 제공한다.
# 키워드 인자
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith='What')
<QuerySet [<Question: What's up?>]>
# 올해의 질문을 입력해보자
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>
# 존재하지 않은 ID를 요청하면 예외처리가 뜬다.
>>> Question.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Question matching query does not exist.
# 기본 키로 조회하는 것이 가장 일반적인 경우이다. 장고도 마찬가지이다.
# 기본 키를 정확하게 조회하는 것 Question.objects.get(id=1)이다.
>>> Question.objects.get(pk=1)
<Question: What's up?>
# 내가 만든 것이 제대로 작동하는 지 확인해보자
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True
# 질문에 몇 가지 선택사항을 제공한다.
# Choice 객체는 INSERT 문을 수행하고 집합에 선택 항목을 추가한다.
# 사용 가능한 선택 항목의 수를 반환하고 새로운 Choice 개체를 반환한다.
# ForeignKey 관계의 다른 쪽을 유지하도록 설정한다.
# 예를 들어 질문 선택과 같이 API를 통해 액세스할 수 있다.
>>> q = Question.objects.get(pk=1)
# 관련 개체 집합에서 선택 항목을 표시하는 것이지만 기존에 만든 것이 없으므로 아무것도 나오지 않는다.
>>> q.choice_set.all()
<QuerySet []>
# 3개의 선택지를 만든다.
>>> q.choice_set.create(choice_text='Not much', votes=0)
<Choice: Not much>
>>> q.choice_set.create(choice_text='The sky', votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)
# Choice 객체는 관련된 Question 객체에 대한 API 액세스 권한을 가진다.
>>> c.question
<Question: What's up?>
# 위의 반대의 경우도 마찬가지로 Question 객체도 Choice 객체에 액세스할 수 있다.
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3
# API는 필요한 만큼 자동으로 관계를 따른다.
# 관계를 구분하라면 이중 밑줄을 사용해야한다.
# 원하는 만큼 깊은 수준까지 작동이 가능하고 제한은 없다.
# pub_date가 올해인 모든 질문에 대한 모든 선택을 찾기
# (위에서 생성한 'current_year' 변수 재사용).
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
# 선택 항목중 하나를 삭제하기 위해서는 delete() 함수를 사용하면 된다.
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()
관리자 생성
$ python manage.py createsuperuser
- 관리 사이트에 로그인할 수 있는 사용자를 생성해준다.
Username: admin
Email address: admin@example.com
Password: *******
Password(again): *******
-
사용할 이름, 이메일, 비밀번호를 입력해주면 해당 문구가 나올 것이다.
Superuser created successfully
개발 서버 시작
$ python manage.py runserver
이후에 127.0.0.1:8000으로 접속하면 에러문구가 나올 것이다. 뒤에 /admin을 추가해서 해당 도메인으로 이동한다.
- 관리자 사이트에 접속하기
- 접속한 이후에는 아이디와 비밀번호를 입력하고 여러가지 컨텐츠를 사용할 수 있다.
- 이는 django.contrib.auth 모듈에서 제동되는 인증 프레임워크이다.
관리 사이트 poll app 변경해서 사용하기
현재 위치는 polls/admin.py
from django.contrib import admin
from .models import Question
admin.site.register(Question)
- 해당 코드는 질문 대상에 관리 인터페이스를 알려주는 것이다.