5

私が取り組んでいるプロジェクトのいくつかの制限により、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 チームがそうしたことをしたのか説明できません。

4

1 に答える 1