自体のprefetchはできる。その更に先のrelationをprefetchすることができない。これをどうにかしようと言う苦肉の策を考えてみたという話。foreignkey関連のコードを読んでみたところ綺麗にできる方法は無さそうだった。実行時のprefetchの条件を上手く受け渡す方法が存在しなさそうだったので。objectを作りそこでprefetchの条件を指定できるようにする。以下の様な形のモデルになっているとする。{Y}CXYFeedというモデルが有りこれがgenericなrelationを持っており、A,B,Cのいずれかを保持する。AはXモデルとBはYモデルと1:Nの関係になっている。今回はFeedのqueryを取ってくる際にA,B,Cだけでなく、Aに結びつくX,Bに結びつくYも一緒に取ってくるようにしたい。以下のようなqueryを実行するとする。xs,ysの取得に関してはN+1になってしまう。content_list.append(use(feed.content))この時以下のようにprefetchを指定するとエラーになる。試行錯誤を行なったdjangoのversionは1.9.5だった。基本的な方針としては以下のようになる。GenericForeignKeyのget_content_typeが各relation(ここではA,B,C)を取ってくる際の始端となるオブジェクトになっている。これを書き換え、各relationを取ってくるquerysetを生成するところにprefetch_relatedを追加する処理を加えてあげる。自分で定義したサブクラスに置き換える。これはmethodの挙動を書き換えるための雑な方法。真面目な方法ではない。ct各relationの取得に、MyContentTypeのget_all_objects_for_this_type()が使われる。typeのインスタンスの取得はキャッシュされているのでまじめに使う場合には注意が必要。このようにすると以下のようなquery中でもX,Yを含めてprefetchしてくれるようになる。content_list.append(use(feed.content))ただし、上のようにした場合には、xs,ysのprefetchがデフォルトの動作になってしまう点が問題になる。できれば実行時にprefetchの条件を指定したい。冒頭の方にも書いたがdjangoの現状のコードセットではつらい。objectにprefetchの条件を格納させることにする。まじめに実装するなら、異なる条件が二重に重なる場合なども考えなければいけなそうではあるけれど。そこまではやっていない。ct以下の様にして使う。想定していたモデルの定義は以下のようなものだった。relationをprefetchする方法Tweet広告を非表示にする関連記事2018-08-13functools.partialの元を辿る時折、functools.partialで作られた値の元の値(関数)を辿りたく...2017-02-191ファイルのアプリでview_configを使う。誰も特をしないpyramidの話。componentという機能を追加した月別アーカイブはてなブログをはじめよう!podhmoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。