기존에는 아래와 같은 방식으로 모델을 작성하였다.
순서대로 모델 안에 filter 를 접근하고 그 안에 특정 조건(pk, user 값 넘겨주기)을 넣는 방식이였는데
pk, user 값을 넘겨주는데 이것들은 AND function 이다.
pk 가 어떤 값이고, user 가 어떤 값이고 해서 이 두개의 조건을 모두 만족시키는 AND function 인 것.
그렇다면 OR function 은 어떻게 구현하고
WHERE function 은 어떻게 구현해야 하는 것일까
Field Lookups
다음 두 가지로 나누어서 구현할 것.
1) 유저가 구독하고 있는 프로젝트들을 확인하기
2) 그 프로젝트 안에 있는 모든 게시글들을 가져오는 것이 두번쨰
우리가 항상 작성했던 형식은 다음과 같이 특정 게시글의 model 에 접근하여 pk, user 를 넣는 형식
위를 아래와 같은 형식으로 바꿀 것이다.
뒤에 두개를 초점을 맞춰 봐야함
언더바 두개는 장고에서 말하는 Field Lookups 라고 부른다.
그렇다면 이게 어떤 식으로 DB 에서 작동을 하느냐
SQL 에서는 다음과 같이 작동을 한다.
위가 이런식으로 매칭이 된다.
목적
복잡한 DB 쿼리를 사용자가 구현할 수 있도록 해주기 위해
우리의 코드에서는 IN 을 사용할 것이지만 장고에서는 다음과 같은 여러 Field Lookups 을 제공한다.
코드 구현
Views.py 수정
게시글들을 보여줘야 하니까 List View 를 만들어줄것.
기존처럼 단순히 article 을 싹다 가져오는 것이 아니라 article 에 있는 특정 조건을 가진 게시글들만 가져와야되기 때문에 get_queryset 를 정의할 것
모델을 보게 되면 user, project 가 있는데 이 project 에 대해서 리스트화 시킨다는 뜻.
결국 project 라는 변수 안에는 project 리스트(구독한 모든 프로젝트들)가 담겨있게 된다.
위를 기반으로 Field Lookups 을 사용하여 article_list 를 작성하고 return
...
@method_decorator(login_required, 'get') # 로그인 하였는지
class SubscriptionListView(ListView):
model = Article
context_object_name = 'article_list'
template_name = 'subscribeapp/list.html'
paginate_by = 5
def get_queryset(self): # 가지고 오는 게시글들의 조건을 바꿀 수 있는 함수
projects = Subscription.objects.filter(user=self.request.user).values_list("project") #values_list : 값들을 리스트화 시킨다는 의미.
article_list = Article.objects.filter(project__in=projects) # 바로 위에서 find 한 projects
return article_list
list.html 작성하기
뷰에서 article_list 를 되돌려 주었으니까 html 에서 이 별명을 사용하기 위해 템플릿 작성하기
pinterest 레이아웃을 이전에 조각화 시켜놓았던것을 가져다가 쓰고, view 에서 넘겨받은 article_list 를 이 안에서 사용하는 article_list 로 대입시키기.
{% extends 'base.html' %}
{% block content %}
{% endblock %}
url 추가
from django.urls import path
from subscribeapp.views import SubscriptionView, SubscriptionListView
app_name = 'subscribeapp'
urlpatterns = [
path('subscribe/', SubscriptionView.as_view(), name='subscribe'),
# 추가
path('list/', SubscriptionListView.as_view(), name='list'),
]
테스트
구독이 되어 있는 상태
구독 취소 상태라면 게시글이 없다
즉, 구독한 대로 게시글이 나오는 것을 볼 수 있다.
따라서 다시 구독을 하고 http://127.0.0.1:8000/subscribe/list/ 로 접속하면 다음과 같이 구독한 게시판의 글이 모두 나오는 것을 확인할 수 있다.
nav 추가