私が取り組んでいるプロジェクトのいくつかの制限により、Django の QuerySet クラスをカスタム クラスに置き換える必要がありました。QuerySet オブジェクトはメソッドを連鎖させることができるQuerySet().filter(...).exclude(...)
ので (たとえば、など)、私の実装では、すべてのメソッドは単純に を返しますself
。したがって、私のクラスは次のようになります。
class MyQuerySet:
...
def filter(self, *args, **kwargs):
# Do some stuff and then:
return self
このようにして、Django の QuerySet の動作を模倣しました。
しかし、Django のコードを見てみるとself
、QuerySet のメソッドは呼び出されるたびに を返すのではなく、複製されたオブジェクトを返すことに気付きました。次のようになります (不要なものを削除)。
class QuerySet(...):
...
def filter(self, *args, **kwargs):
clone = self._clone()
# Do some stuff and then
return clone
def _clone(self,...):
klass = self.__class__
obj = klass(...)
return obj
したがって、基本的に、メソッドが呼び出されるたびに、QuerySet は自身を複製し、新しいオブジェクトをインスタンス化して返します。
私の質問は:なぜですか?私のやり方は間違っていますか?
私が恐れているのは、私のやり方では何かが壊れてしまうのではないかということです。さもなければ、なぜ Django チームがそうしたことをしたのか説明できません。