티스토리 뷰

Framework/Django

Django get_or_create

Loweeeell 2018. 3. 11. 23:32

상황 : 인스타그램 project를 하는 도중, ajax를 사용하여 follow 기능을 구현하는 데 버튼을 2개 만들어 놓고 id 별로 따로 view 처리(follow,unfollow)를 하니 jquery를 처리하는 과정에서 딜레이나 어디선가 꼬여 서버 에러가 계속 났다. 이 문제로 2틀을 날렸다.. 

구글링을 통해 get_or_create 메소드로 해결 가능하다는 것을 알게 되었다.

get_or_create

이 메소드는 구하고자 하는 객체가 존재할 경우 객체를 얻고 객체가 존재하지 않으면 생성한다. 

반환은 (object,created)로 튜플 형식으로 반환한다.

object는 우리가 얻고자 한 모델의 인스턴스이고

created는 boolean flag이다.

인스턴스가 get_or_create에 의해 생성이 되었으면 True를 반환하고,

인스턴스를 기존 데이터베이스에서 꺼내왔으면 False를 반환한다.


해결 : 하나의 버튼으로 view 로직을 짜 조건에 맞는 follow 객체가 있었는지 created를 통해 알아내어 True 라면 새로  생성된 거니 팔로잉 요청으로 처리하고 False라면 이미 팔로잉한 상태에서 버튼을 눌른 것이기 때문에 언팔로잉 처리를 해준다.

@login_required()
def post_like(request,pk):
    post = Post.objects.get(pk=pk)
    like,flag = Like.objects.get_or_create(post=post,user=request.user) # 기존에 객체가 없으면 객체  생성 후 반환,있으면 객체 반환
    if not flag: # 언팔로잉 요청일 경우
        like.delete() # 팔로우 객체 삭제
        message = 'liked'
    else:
        message = 'like'
        like_count = Like.objects.filter(post=post).count()
    data = {
        'message':message,
        'like_count':like_count
    }
    return JsonResponse(data)


댓글