240329

송용진·2024년 3월 29일

Django ORM 다루기 연습문제

연습문제 1

문제: Question 모델의 pk=2를 가진 객체를 가져오는 Django 쿼리를 작성하세요.
from polls.models import Choice, Question
Question.objects.get(pk=2)
<Question: 내일 뭐할까?_Question>

연습문제 2

문제: Question 인스턴스의 was_published_recently() 메서드가 False를 반환하는지 확인하는 코드를 작성하세요.
q = Question.objects.get(pk=2)
q.was_published_recently()
True

연습문제 3

문제: Question 인스턴스에 새로운 Choice 객체를 추가하지 않고, 현재 관련된 모든 Choice 객체를 표시하는 코드를 작성하세요.
q = Question.objects.get(pk=2)
q
<Question: 내일 뭐할까?_Question>
q.choice_set.all()
<QuerySet [<Choice: Choice object (1)>, <Choice: Choice object (2)>]>

연습문제 4

문제: "Nothing really"라는 choice_text를 가지고 votes가 10인 새 Choice 객체를 생성하는 코드를 작성하세요.
q = Question.objects.get(pk=1)
q.choice_set.create(choice_text="Nothing really", votes=10)

연습문제 5

문제: 모든 Question 객체에 연결된 Choice 객체의 총 개수를 반환하는 코드를 작성하세요.
q = Question.objects.get(pk=1)
q.choice_set.count()

연습문제 6

문제: Question 모델의 pub_date가 현재 연도인 모든 Choice 객체를 찾는 코드를 작성하세요. 여기서 current_year는 현재 연도를 나타내는 변수입니다.
from django.utils import timezone
current_year = timezone.now().year
Choice.objects.filter(questionpub_dateyear=current_year)

연습문제 7

문제: choice_text가 "Just hacking again"으로 시작하는 모든 Choice 객체를 삭제하는 코드를 작성하세요.

연습문제 8

문제: Choice 객체 중 votes가 0인 객체만 필터링하는 Django 쿼리를 작성하세요.

연습문제 9

문제: Question 객체 중 pub_date가 2023년 1월 1일 이후인 모든 객체를 가져오는 Django 쿼리를 작성하세요.

연습문제 10

문제: Choice 객체 중 questionpub_date가 현재 날짜보다 이전인 모든 객체를 가져오는 Django 쿼리를 작성하세요. 여기서 current_date는 현재 날짜를 나타내는 변수입니다.


View + HttpResponse 연습문제

연습문제 1 (표현 형태는 자유)

문제: Question 모델의 pub_date를 기준으로 가장 최근의 질문 10개를 선택하는 Django view 함수를 작성하세요.

def exercise1(request):
    latest_question_list = Question.objects.order_by("-pub_date")[:10]
    context = {"latest_question_list": latest_question_list}
    return render(request, "polls/exercise1.html", context)

연습문제 2

문제: Django view에서 Question 객체들 중 pub_date가 오늘 날짜인 객체만 선택하여, 그 질문들의 텍스트를 쉼표로 구분된 문자열로 반환하는 함수를 작성하세요.

def exercise2(request):
    # 어제 날짜를 ISO 포맷의 문자열로 변환
    yesterday_str = (timezone.now().date() - timedelta(days=1)).strftime('%Y-%m-%d')
    # 변환된 문자열을 사용하여 날짜 필터링
    latest_question_list = Question.objects.filter(pub_date__date=yesterday_str)
    output = ", ".join([q.question_text for q in latest_question_list])
    return HttpResponse(output)

연습문제 3

문제: HttpResponse를 사용하여 "Hello, world!" 텍스트를 반환하는 가장 간단한 Django view 함수를 작성하세요.

def exercise3(request):
    return HttpResponse("Hello, world!")

연습문제 4

문제: Django의 Question 모델에서 pub_date가 현재 연도인 질문만 필터링하여, 그 질문들의 텍스트를 반환하는 view 함수를 작성하세요. 현재 연도는 자동으로 계산되어야 합니다.

def exercise4(request):
    current_year = timezone.now().year    
    latest_question_list = Question.objects.filter(pub_date__year=current_year)
    output = " / ".join([q.question_text for q in latest_question_list])
    return HttpResponse(output)

Django에서의 render
템플릿을 사용하여
HTTP 응답을 생성하는 기능을 제공하는 함수

일반적으로 Django에서는 웹 페이지를 생성하기 위해
HTML 템플릿을 사용하며,
render 함수를 사용하여
해당 템플릿을 렌더링하여
사용자에게 반환될 최종적인 HTML 페이지를 생성


첫 번째 장고 앱 작성하기, part 3

개요

뷰 추가하기

polls/views.py

def detail(request, question_id):
	return HttpResponse("You're looking at question %s."% question_id)

detail 함수는
Django 웹 프레임워크에서 특정 질문의 상세 정보를 보여주는 뷰(view)로 사용됨

각 매개변수의 역할

  1. request
    이 매개변수는 현재 사용자의 요청에 대한 모든 정보를 담고 있는 HttpRequest 객체
    Django에서는 클라이언트로부터 받은 요청에 대한 데이터(예: GET 및 POST 데이터), 메타데이터(예: 사용자의 IP 주소나 브라우저 정보) 등을 이 객체를 통해 접근할 수 있습니다. request 객체는 사용자의 요청 유형(GET, POST 등)을 확인하거나, 사용자 세션에 접근하는 등의 작업에 사용될 수 있습니다.

  2. question_id: 이 매개변수는 URL에서 동적으로 추출된 값을 담고 있으며, 보통 특정 데이터베이스 레코드를 식별하는 데 사용됩니다. 예를 들어, question_id가 3이라면, 이는 데이터베이스 내에서 ID가 3인 질문을 찾아 상세 정보를 보여주는 것을 목적으로 합니다. Django의 URLconf(URL configuration)에서 정규 표현식이나 경로 변환자(path converter)를 사용하여 URL의 일부를 question_id와 같은 뷰의 매개변수로 전달할 수 있습니다.

함수 내부에서는 question_id를 사용하여 문자열 포맷팅을 통해 해당 질문의 ID를 포함한 메시지를 HttpResponse 객체로 반환합니다. 실제 애플리케이션에서는 이 question_id를 사용하여 데이터베이스에서 해당 ID를 가진 질문의 상세 정보를 조회하고, 이를 사용자에게 보여주기 위한 템플릿을 렌더링하는 등의 작업을 수행할 것입니다.

간단하게 요약하자면, request는 사용자의 요청 정보를 담고 있고, question_id는 URL을 통해 전달받은 특정 질문의 식별자(ID)입니다. 이 두 정보를 활용하여 사용자에게 해당 질문의 상세 정보를 보여주는 로직을 구현하는 것이 detail 함수의 역할입니다.

profile
개발자

0개의 댓글