def view_poll_by_id(request, id):
# get : 데이터를 하나 특정해서 가져온다.
topic = Topic.objects.get(id=id)
# filter : 특정 조건과 일치하는 레코드들을 조회한다.(검색기능에 사용되는 메소드)
options = Option.objects.filter(topic=topic).all()
total_votes = Vote.objects.filter(topic=topic).count()
results = {}
for item in options:
vote_count = Vote.objects.filter(option=item).count()
# ZeroDivisionError 방지
if total_votes > 0:
rate = vote_count / total_votes * 100
result_text = "투표 수: %d, 득표율: %.2f%%" % (vote_count, rate)
else:
result_text = "투표 없음"
results[item.name] = result_text
context = {
'topic' : topic, # topic은 문자열 형태
'results' : results, # results는 딕셔너리 형태로 템플릿에서 키와 값을 구분지어 받을 예정
}
return render(request, 'votes/view_poll_by_id.html', context)
all()
메소드를 사용한다.>>> all_entries = Entry.objects.all()
all()
메소드는 데이터베이스에 있는 모든 객체의 QuerySet을 반환한다.all()
이 반환한 QuerySet은 데이터베이스 테이블의 모든 개체를 설명한다. 대개 일반적으로 전체 개체 집합 중 하위 집합만 사용하면 된다.
이러한 하위 집합을 만들기 위해서 초기 QuerySet을 구체화하고 필터 조건을 추가한다. QuerySet을 구체화하는 가장 일반적인 두 가지 방법은 아래와 같다.
filter(**kwargs)
exclude(**kwargs)
>>> Entry.objects.all().filter(pub_date__year=2006)
filter()
는 단일 개체만 쿼리와 일치하더라도 항상 QuerySet을 제공한다. 이 경우 단일 요소를 포함하는 QuerySet이 된다. 쿼리와 일치하는 개체가 하나만 있다는 것을 알고 있는 경우 객체를 직접 반환하는 get()
을 사용할 수 있다.
get()
을 사용하는 방법과 슬라이싱의 [0]을 이용한 filter()
를 사용하는 것은 차이가 있다. 쿼리와 일치하는 결과가 없다면 get()
은 DoesNotExist
예외를 발생시킨다. 이 예외는 쿼리가 수행되는 모델 클래스의 속성이다.
>>> one_entry = Entry.objects.get(pk=1)
위와 같은 코드에서 기본키가 1인 개체를 탐색하려고 한다. get()
을 이용한 경우 만약, 기본키가 1인 Entry 모델의 개체가 없다면 Django는 DoesNotExist
를 발생시킨다.
또한 get()
은 단일 개체에 대한 QuerySet을 제공한다는 점을 보았을 때 만약 둘 이상의 항목이 일치한다면 Django에서는 MultipleObjectsReturned
에러가 발생한다.