Django F()


Fオブジェクト


データベースからPythonメモリにインポートしません.
データベース・レベルで演算します.
jack = Student.objects.get(pk=pk)
jack.score += 1
jack.save()
1.以上のコードはPythonがロードした値を参照し、+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.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()を再度呼び出すと、予期せぬ値に変更される可能性があります。