Import


from django.db.models import Q, F

Q object


  • Django DB 관련 작업에서 사용할 수 있는 SQL 조건문

  • filter 메서드에서 주로 사용

  • OR이나 AND 연산자나 NOT 연산자를 사용하여 조건을 정의하기 위해 사용된다.

      Question.objects.filter(Q(subject__icontains=query) or Q(content__icontains=query))
    • 각 조건을 Q object로 만들고, 두개의 Q object를 각각 or 연산
    • or( | ), and( & ), not( ~ )

F Object

  • 쿼리 내에서 모델 필드 접근할 때 사용
  • 모델 필드나 annotated column의 값을 가져올 때 사용된다.
from django.db.models import F
Entry.objects.filter(number_of_comments__gt=F('number_of_pingbacks'))
  • 표현식과 함께 사용할 때는 반드시 유의해야 한다.
    • F 함수를 만나게 되면 캡슐화된 SQL문을 생성하기 위해 파이썬 연산자를 오버라이딩 한다.
# Tintin filed a news story!
reporter = Reporters.objects.get(name='Tintin')
reporter.stories_filed += 1
reporter.save()

###############################################

from django.db.models import F

reporter = Reporters.objects.get(name='Tintin')
reporter.stories_filed = F('stories_filed') + 1
reporter.save()

# reporter.refresh_from_db(fields=['stories_filed'])

reporter.name = 'Tintin Jr.'
reporter.save() # 
  • 위 소스를 아래 소스로 바꾸려고 하는건데.. 문제가 있다.
  • 아래 소스는 F('stories_filed') + 1 자체를 SQL Syntax로 만들어버려서 reporter.stories_filed의 값이 1 증가하는 쿼리가 실행된다. 이 때, reporter.stories_filed의 값을 갱신하는것이 아님. 데이터베이스 자체의 SQL문 실행
  • reporter.stories_filed 값을 실제 저장된 값으로 업데이트하기 위해선 모델을 데이터베이스에서 다시 불러와주어야 한다.
  • F Object는 save() 이후에도 모델에 남아있는 문제가 있으며, 각 save()에 적용된다. 따라서 초기 값이 1이라고 할 때, 처음 save 연산자를 해주면 SQL문이 실행되어 2가 되는데, 다음에 또 save 연산을 해주면 또 SQL문이 실행되어 3이 된다.이 과정을 해결해주기 위해서는 refresh_from_db()를 사용해주면 된다.
    • Model.refresh_from_db(using=None, fields=None)

pk

  • get을 할때, pk로 입력하나 id로 입력하나 같은 결과가 나온다.
  • pk가 id__exact와 같다고 한다.
model.objects.get(id=1)
model.objects.get(pk=1)

'프레임워크 > Django' 카테고리의 다른 글

[ Django ] Session  (0) 2021.10.17
[ Django ] CSRFToken  (0) 2021.10.16
[ Django ] JWT(djangorestframework-simplejwt)  (0) 2021.10.15
[ Django ] JWT  (0) 2021.10.14
[ Django ] Choice  (0) 2021.09.15

+ Recent posts