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(request, username):
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(request, username):
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(request, username):
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,
})
'장고 프레임워크' 카테고리의 다른 글
HINT: Add or change a related_name argument to the definition for 'Post.like_user_set' or 'Post.author'. (0) | 2020.06.11 |
---|---|
4) APIView를 활용한 뷰 만들기 (0) | 2020.06.07 |
Django Template 문법에 관하여 (0) | 2020.06.03 |
Django Model 관계에 관하여. (0) | 2020.06.03 |
3 - JSON 직렬화 (0) | 2020.05.31 |
댓글