Q 객체 & F 객체

sunwoo·2020년 12월 27일
0

Django

목록 보기
3/5
post-thumbnail

Q 객체

filter, exclude, get 과 같은 함수를 함께 사용하여 복잡한 조건 검색을 효율적으로 사용 가능하다.

model.objects.filter(Q(flag=True) | Q(model_num__gt=1), name__startswith="Q")

OR

from django.db.models   import Q 

Album.objects.filter(Q(price<777) | Q(wating>7)) 
SELECT * FROM album WHERE price < 777 OR wating > 7

AND

q = Q()
q.add(Q(price=777), q.OR)
q.add(Q(name='아이유' | Q(name='아이린'), q.AND)
q.add(Q(1000), q.OR)

Album.objects.filter(q)
SELECT * FROM Album WHERE (price=777 AND (name='아이유' OR name='아이린')) OR price=1000 

NOT


q = Q()
q.add(Q(price=777), q.OR)
q.add(Q(name='아이유') & ~Q(name='아이린'), q.AND)
Album.objects.filter(q)
SELECT & FROM products WHERE price=777 AND name='아이유' AND NOT (name='아이린')

F 객체

  • 쿼리 수를 줄여준다.
  • Race condition을 회피할 수 있다. 쓰레드와 유사.
  • python을 사용하지 않아도 DB에 접근 가능하다.
artist = Album.objects.get(user_id=1)
artist.count = F('count') + 1
artist.save()

artist.artist.name = '아이유' 
artist.save()
  • F()는 각 저장마다 적용!!!
    위의 예시에서
    첫 count가 1이면, 마지막 artist.save()를 통과하면 3이된다.
    즉, 상관없는 필드를 수저하고 저장하더라도 F()의 값이 수정된다.
profile
고영희를 모시고 있는 Backend 개발자 🐈

0개의 댓글