0

私はいくつかのコードを見ていますが、これが良い習慣であるかどうか興味があります。

      class ToDoManager(models.Manager):
          def scheduled(self):
          """
          Returns QuerySet of all things to be done.
          """
          return self.filter(...)


      class ImpStuff(models.Model):
          ....model definition

          objects=TodoManager    

カスタム マネージャーが get_query_set (言い換え) メソッドをオーバーライドするのをいつも見てきました。代わりに、これは物事を処理する良い方法ですか?

4

2 に答える 2

3

複雑な ORM クエリをラップするためにモデル マネージャーを使用することは、非常に DRY であり、推奨されます。これらのメソッドにパラメーターを追加して、多くのコードを節約できます。

class ToDoManager(models.Manager):
      def scheduled(self, start_date, end_date):
      """
      Returns tasks to be done within two dates.
      """
      return self.filter(...)

次に、次のようにします。

todo_tasks = ImpStuff.objects.scheduled(datetime.now(), datetime.datetime.now() + datetime.timedelta(3))

マネージャーは、Github で入手できる多くのオープン ソース Django アプリで使用されています。

于 2011-08-25T18:18:04.890 に答える
1

私は前にこれをやった。それはうまくいきました。したがって、私のコードを見ているのでない限り、これが便利だと思う人が世界中に 2 人いるようです。

オーバーライドに代わるものではありません。(フィルター処理された) インスタンスを取得する追加get_query_setの方法を提供します。両方を同時に行うことができます (合理的な範囲内で)。

どのような問題が予想されますか?

PS このアプローチは、Manager が のようなメソッドで拡張されている Pro Django の 274 ページ以降でも使用されていますmost_recent()

于 2011-08-25T17:16:31.893 に答える