- 2009-05-03 (日) 1:44
- Django
あるmodelに削除フラグを追加したので、かならずそのフラグを参照するようにget_query_setをオーバーライドしたマネジャを用意し、それを該当modelのデフォルトマネジャに設定した。
マネジャ — Django v1.0 documentation
とはいえ、削除フラグのたっている(削除済み)のデータも扱いたいときがあったんで、別のマネジャを使って削除済みデータを取得してsaveしたら、PKの重複エラーが出てしまった。
どうやらUpdateではなくInsertしようとしたみたい。
ソースをちらっと見たところ、デフォルトのマネジャで検索してInsertするかUpdateするか判断しているっぽい。
カスタムのマネジャオブジェクトを使う場合、 Django がモデル内に最初に見つけたマネジャ (モデルに定義した順番で最初のマネジャ) は特別扱いされるということに注意してください。 Django はクラス内で最初に見つけたマネジャを「デフォルトの」マネジャにし、このデフォルトマネジャを (admin アプリケーション以外でも) あちこちでモデルのマネジャとして使います。ですから、 get_query_set() のオーバライドによって、扱いたいオブジェクトを取り出せなくなるような羽目に陥らないように、デフォルトマネジャの選択には細心の注意を払ってください。
マニュアルには、確かに注意しろと書いてあるけど、まさかsaveできなくなるとは。
saveのデフォルト動作としては正しい気がするんだけど、なんか回避策はないのかなぁ?
force_update=Trueとしても、丁寧に行の存在チェックをしているみたい。
その行は絶対に扱わないということでも無い限り、デフォルトマネジャのget_query_setに細工するのは危険っぽいですね。
- Newer: PILで、Image#tostringができない
- Older: 自宅にネットワーク共有ディスクw導入
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://blog.joyfullife.jp/archives/2009/05/03014419.php/trackback
- Listed below are links to weblogs that reference
- [django]デフォルトマネジャのget_query_setをいじったらsaveできなくなった from 30からのBlog