Django F()

GisangLee·2022년 3월 16일
0

django

목록 보기
7/35

F 객체

데이터 베이스에서 python 메모리로 가져오지 않고
데이터 베이스 레벨에서 연산을 해준다.

jack = Student.objects.get(pk=pk)
jack.score += 1
jack.save()
1. 위 코드는 파이썬에서 불러오는 값을 참조해 +1 한 값으로 update 쿼리를 날린다.
UPDATE student 
SET score = 1 
WHERE student.id = 1

2. F 객체를 사용하면 코드는 아래와 같고

jack = Student.objects.get(pk=pk)
jack.score = F('score") + 1
jack.save()

쿼리문은 이와 같다.

UPDATE student 
SET score = (student.score + 1)
WHERE student.id = 1

주의할 점

값을 변경하고 save()까지 호출헀지만, student의 값은 변경되지 않아서
실제 변경된 값을 알지 못하는 상태로 저장이 되어있다.

>>> student.score
<CombinedExpression: F(score) + Value(1)>

따라서 값을 가져올 때는 get() 메서드나 refresh_from_db() 메서드를 사용한다.

jack = Student.objects.get(pk=pk)
jack.refresh_from_db()

아래를 보면 주의할 점이 보인다.

# score = 1
jack = Student.objects.get(pk=pk) 
jack.score = F('score') + 1
# score = 2
jack.save()
jack.friend = "michael"
# read_count = 3
jack.save() 

jack.score 에는 기존 값에서 하나 증가시킨 값으로 변경하라는 표현식이 들어가있기 때문에 다시 save()를 호출하면 한 번 더 값이 증가하게되어 예상하지 못했던 값으로 변경될 수 있다

profile
포폴 및 이력서 : https://gisanglee.github.io/web-porfolio/

0개의 댓글