F() expressions
아래의 쿼리를 살펴보자.
# 조회수 +1
article = get_object_or_404(queryset, pk=pk)
article.hit = F("hit") + 1
article.save()
게시글을 클릭했을 때 조회수를 증가시키는 코드이다.
위 코드는 article.hit += 1
로도 표현이 가능하다.
차이가 무엇일까?
article.hit += 1
에서는 데이터를 Python 메모리로 가져와서 +1 연산을 한 다음 다시 데이터베이스에 저장한다.
이 때, F() 객체를 사용하면 필드의 값을 Python 메모리로 가져오지 않고 데이터베이스 상에서 연산할 수 있다.
F() 객체는 Python 연산자를 오버라이딩하여 캡슐화된 SQL문을 생성하기 때문이다.
모든 작업이 데이터베이스에서 이루어지므로, Python에서는 article.hit의 값을 알 수 없다.
이후 저장된 값을 이용하려면 article.refresh_from_db()
를 호출해 다시 불러와야한다.
** 주의할 점
article.hit = F("hit") + 1cle,
article.save()
~~~블라블라 ~~~
article.save()
F()객체를 이용한 쿼리셋은 save() 이후에도 질의문이 유지된다.
따라서 위 코드를 실행하면 결과적으로 hit이 +2 되니 주의해야한다.
FileField와 ImageField
Q(file='')|Q(file=None)
형태로 작성하면 된다.