본문 바로가기
장고 프레임워크

views.py에 관하여

by 문자메일 2020. 6. 4.

get_object_or_404 ( )

#import 필요

from django.shortcuts import redirect, render, get_object_or_404

# DB User Model에서 username이 username인 값을 가져온다. 

follow_user = get_object_or_404(User, username=username, is_active=True)

 

 

Messages.success

messages.success(request, f"{follow_user}님을 팔로우했습니다.")

 

request.META.get("HTTP_REFERER""root") - 요청 보낸 URL 찾는법, 없으면 root로 이동

redirect_url = request.META.get("HTTP_REFERER""root")

return redirect(redirect_url)

 

 

ManyToMany field에 값 추가하는 법

def user_follow(requestusername):

    follow_user = get_object_or_404(User, username=username, is_active=True)

    # request.user에 로그인한 user 정보가 있는것 같음. 그 user의 MTN model field에 팔로잉 할려는 User data를 add하는 부분

    request.user.following_set.add(follow_user)

    # 팔로잉 당하는 User Model에도 팔로잉 신청하는 User Data 추가

    follow_user.follower_set.add(request.user)

 

def user_unfollow(requestusername):

    unfollow_user = get_object_or_404(User, username=username, is_active=True)

    request.user.following_set.add(unfollow_user)

    unfollow_user.follower_set.add(request.user)

    

 

Django ORM에 OR, AND 조건 쓰는법

아래 예시와 같이 '|' 나 '&'으로 OR,AND조건 줄 수 있음.

from django.db.models import Q

post_list = Post.objects.all()\

        .filter(

            Q(author=request.user) | 

            Q(author__in=request.user.following_set.all())

        )

 

 

 

URLs.py에서 넘겨받은 username이 logind된 User가 가진 ManyToMany field에 존재하는지 확인하기 위한 코드 부분

def user_page(requestusername):

    page_user = get_object_or_404(get_user_model(), username=username, is_active=True# is_active는 접근 허용된 사람들만 보겠다는 의미

    post_list = Post.objects.filter(author=page_user)

    post_list_count = post_list.count() # 실제 데이터베이스에 count 쿼리를 던지게 된다.

    #len(post_list) 이렇게 쓰는거는 post_list 전체를 다 가져와서 메모리에 얹은 다음에 메모리상의 리스트의 갯수를 반환해주는 부분이다.

    

    #login이 되어 있을 경우 User 객체, 아닐 경우 AnonymousUser 객체 리턴

    if request.user.is_authenticated:

        is_follow = request.user.following_set.filter(pk=page_user.pk).exists()

    else:

        is_follow = False

 

ORM으로 특정 시간 이후로 filter 거는 방법

from datetime import timedelta

from django.utils import timezone

 

@login_required

def index(request):

    timesince = timezone.now() - timedelta(days=3)

    post_list = Post.objects.all()\

        .filter(

            Q(author=request.user) | 

            Q(author__in=request.user.following_set.all())

        )\

        .filter(

            created_at__gte=timesince #최근시간에서 3일 이내의 포스팅만 보여줌

        )

 

    suggested_user_list = get_user_model().objects.all()\

        .exclude(pk=request.user.pk)\

        .exclude(pk__in=request.user.following_set.all())[:3]

    return render(request, "instagram/index.html",{

        "post_list":post_list,

        "suggested_user_list":suggested_user_list,

    })

댓글