from django.http import JsonResponse
from django.views import View
from django.db.models import Q
from films.models import Film
class FilmView(View):
def get(self, request):
try:
genre = request.GET.get('genre', None)
country = request.GET.get('country', None)
running_time_min = request.GET.get('time', None)
sort = request.GET.get('sort')
offset = int(request.GET.get('offset', 0))
limit = int(request.GET.get('limit', 10))
q = Q()
if genre:
q &= Q(genres__name = genre)
if country:
q &= Q(countries__name = country)
if running_time_min:
q &= Q(running_time_min__lte = int(running_time_min))
sort_set = {
'random' : '?',
'score' : 'rate_set__score',
'time-ascending' : 'running_time_min',
'time-descending' : '-running_time_min',
}
order_key = sort_set.get(sort, 'id')
films = Film.objects.filter(q).order_by(order_key)[offset:offset+limit]
results = [{
'id' : film.id,
'name' : film.name,
'release_date' : film.release_date.year,
'image_url' : film.image_url,
'country' : [country.name for country in film.countries.all()],
'running_time_min' : film.running_time_min,
} for film in films]
return JsonResponse({'results' : results}, status = 200)
except KeyError:
return JsonResponse({'message' : 'KEY_ERROR'}, status = 400)
request.GET.get('<key>', defalt = None)
request.GET은 http request 정보를 dictionary 형태로 받을 수 있게 한다. key값에 해당되는 value 값을 불러오며, 만약 value가 없는 경우에는 None을 반환한다.
/films?genre=드라마&sort=random
경로를 요청하면, genre가 드라마인 value값을 랜덤으로 가져온다. 만약 value값이 없다면 아무것도 반환하지 않는다.
sort = request.GET.get('sort')
offset = int(request.GET.get('offset', 0))
limit = int(request.GET.get('limit', 10))
order_key = sort_set.get(sort, 'id')
films = Film.objects.filter(q).order_by(order_key)[offset:offset+limit]
genre가 드라마인 value값을 3번째 인덱스부터 가져온다(0,1,2 인덱스 제외).
genre가 드라마인 value값을 3~14번쩨 인덱스까지만 가져온다.
limit을 개수로 사용하기 위해서 이렇게 코드를 작성했다. 만약 [offset:limit]으로 쓴다면 &offset=3&limit=12
의 영우 3~11번째 인덱스만 가져올 수 있다.
lte
: less than or equal 작거나 같은 값lt
: less than 작은 값gte
: greater than or equal 크거나 같은 값gt
: greater than 큰 값'random' : '?'
기본적으로 str값으로 가져오기 때문에 숫자를 비교하려면 int로 변경해야 한다.