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()を再度呼び出すと、予期せぬ値に変更される可能性があります。
Reference
この問題について(Django F()), 我々は、より多くの情報をここで見つけました https://velog.io/@masterkorea01/Django-Fテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol