Day 3 : 장고에서 서브쿼리 사용하기, F()객체, FileField

DORA·2022년 4월 24일
0

django-orm

목록 보기
3/6

7. 장고에서 서브쿼리 식을 사용할 수 있나요?


8. 필드의 값을 서로 비교하여 항목을 선택할 수 있나요?

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 되니 주의해야한다.


9. FileField에 파일이 들어있지 않은 행은 어떻게 구할 수 있나요?

FileField와 ImageField

  • FileField, ImageField는 데이터베이스에 CharField로 저장되기 때문에, Q(file='')|Q(file=None) 형태로 작성하면 된다.

profile
리버풀이 리그 우승한다

0개의 댓글