데이터 베이스에서 python 메모리로 가져오지 않고
데이터 베이스 레벨에서 연산을 해준다.
jack = Student.objects.get(pk=pk)
jack.score += 1
jack.save()
UPDATE student
SET score = 1
WHERE student.id = 1
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()를 호출하면 한 번 더 값이 증가하게되어 예상하지 못했던 값으로 변경될 수 있다