2

私がやりたいのは、一部のモデルが私のフィールドを使用すると、そのモデルにカスタムマネージャーが自動的に追加されることです。

私の知る限り、contribute_to_class はそのような機能を提供します

class MyCustomField(CharField):
    def contribute_to_class(self, cls, name):
        super(MyCustomField, self).contribute_to_class(cls, name)
        setattr(cls, 'custom_manager', CustomManager())

問題は、カスタム マネージャーで self.model._default_manager を使用してデフォルト マネージャーでクエリを実行することですが、それを実行しようとすると、django は AttributeError: 'NoneType' object has no attribute '_default_manager' と言います。

Contribut_to_class を使用せず、モデル クラスの横にカスタム マネージャーを記述した場合、期待どおりに動作します。何が問題になる可能性がありますか?

4

2 に答える 2

4

マネージャーは、Fieldsと同様に、contribution_to_classメソッドを持っており、それを呼び出さないと、適切に設定されません。それを呼び出す正しい方法は、Model.add_to_classを使用することです。

class MyCustomField(CharField):
    def contribute_to_class(self, cls, name):
        super(MyCustomField, self).contribute_to_class(cls, name)
        cls.add_to_class('custom_manager', CustomManager())
于 2009-03-04T16:04:19.500 に答える
1
class MyCustomField(CharField):
    def contribute_to_class(self, cls, name):
        super(MyCustomField, self).contribute_to_class(cls, name)
        manager = CustomManager()
        manager.model = cls
        setattr(cls, 'custom_manager', manager)
于 2009-03-04T08:35:40.637 に答える