[解決済み] Django でカスタム QuerySet とカスタム Manager はいつ使い分けるべきですか?
質問
Django では、カスタムマネージャは再利用可能なクエリロジックを整理するための素晴らしい方法です。その に関する Django のドキュメントは カスタムマネージャ が言っています。
をカスタマイズしたい理由は2つあります。
Manager
をカスタマイズしたい理由は 2 つあります : 追加のManager
メソッドを追加したり、初期のQuerySet
というManager
が返されます。
しかし
を記述しています。
どのようにカスタム
QuerySet
クラスを作成する方法、そして、これらのクラスは
QuerySet.as_manager()
:
は
Manager
で生成されたインスタンスはQuerySet.as_manager()
は、実質的にPersonManager
とほぼ同じになります。
の間でロジックを整理する方法には、多くの柔軟性があるように思えます。
Manager
とカスタム
QuerySet
クラスがあります。いつ、一方を使用するか、他方を使用するかを決定する原則は何ですか?
どのように解決するのですか?
主に、クエリを簡単に構成できるようにするためです。一般に、クエリセットの呼び出しの連鎖の中で、既存のクエリセットに対して何らかの操作を行えるようにしたい場合は
QuerySet
.
例えば
Image
モデルがあり
width
,
height
のフィールドがあります。
class Image(models.Model):
width = ... # Width in pixels
height = ... # Height in pixels
を使えば、いくつかのカスタム
QuerySet
メソッドを書くことができます。
class ImageQuerySet(models.QuerySet):
def landscapes(self):
return self.filter(width__gte=models.F('height'))
def portraits(self):
return self.filter(width__lte=models.F('height'))
def small(self):
return self.filter(width__lte=1200)
def large(self):
return self.filter(width__gte=1200)
class ImageManager(models.Manager):
def get_queryset(self):
return ImageQuerySet(self.model, using=self._db)
で、動的なクエリセットが簡単に作れるようになりました。
Image.objects.all().portraits().small()
Image.objects.all().large().portraits()
論理的には、これらの関数は主に既存のクエリセットのモデルのパーティショニングや再定義に関係するものであるべきです。既存のquerysetを操作しない、querysetを全く返さない、あるいは、この特定のモデルを伴わない、いくつかの関連するロジックを実行しなければならないような状況では、モデルマネージャがより適していると言えるでしょう。
関連
-
[解決済み】Djangoのクエリセットフィルタリングでnot equalを行うにはどうすればよいですか?
-
[解決済み] pandasを使った "大量データ "ワークフロー【終了しました
-
[解決済み] Pythonのdictsで'has_key()'と'in'のどちらを使うべきですか?
-
[解決済み] DataFrameの文字列、dtypeがobjectの場合
-
[解決済み] PythonでSVGからPNGに変換する
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] 異なる順序で同じ要素を持つ2つのJSONオブジェクトを等しく比較するには?
-
[解決済み] 新しいpip backtrackingの実行時問題の解決
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] Pythonのマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] tensorflowのCPUのみのインストールでダイナミックライブラリ 'cudart64_101.dll' を読み込めなかった
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] Pythonでランダムなファイル名を生成する最良の方法
-
[解決済み] pipの依存性/必要条件をリストアップする方法はありますか?
-
[解決済み] Pythonでリストが空かどうかをチェックする方法は?重複