2011-01-14 14 views
7

DjangoのForeignRelatedObjectsDescriptor.create_manager(...)関数は、RelatedManagerクラスを動的に作成し、続いて動的に作成されたクラスのインスタンスを初期化します。DjangoのRelatedManagerメソッドをオーバーライドする

RelatedManager.add(...)メソッドをオーバーライドする場合はどうすればよいですか?

RelatedManagerクラスはファイル:django/db/models/fields/related.pyで作成されます。

私はカスタムRelatedManagerを使用したい方法の例は、

class Record(Model): 
    string = CharField() 
class Managed(Model): 
    record = ForeignKey('Record') 
    boolean = BooleanField() 
def view_function(...): 
    record = Record(string='Example') 
    record.save() 
    record.managed_set.add(Managed(boolean=True)) # How to override add()? 

任意の提案をいただければ幸いです...です。

答えて

3

私はあなたが上書きを必要としているかわかりません - デフォルトのクエリーセットは、あなたが望むものを既にしています。

質問に答えるには、モデルにカスタムマネージャーを定義し、use_for_related_fields=Trueを自動マネージャーとして使用するように設定します。 controlling automatic Manager typesのドキュメントを参照してください。

+0

男、あなたは私のジャンゴの指導者です。これらの部分は、あなたが知っているものすべて –

+4

これは動作しません。 use_for_related_fields = Trueを設定するカスタムマネージャを作成すると、RelatedManagerのスーパークラスがカスタムマネージャであることが保証されます。しかし、私の質問で指定されたファイルでは、RelatedManagerクラスが動的に定義され、カスタムマネージャのadd()は、RelatedManagerの動的定義によってオーバーライドされます。私は、RelatedManagerのadd()を変更し、self.pre_save()とself.post_save()を追加してカスタムマネージャ内で実装し、Djangoにパッチを送信することができますが、私がない方が良い方法があるかどうか疑問です知っている。 – brildum

+1

-1それは動作しないので、その変数の '_related_'は歴史の一部であり、関連するフィールドの管理者とは関係ありません。 – Evgeny

0

私は同じ問題を抱えていると思います。

self._dbget_query_set()をオーバーライドして異なるデータベースにルーティングするカスタムマネージャがあります。

モデルクラスが動的に作成され、自分のカスタムマネージャで_default_managerが設定されています。

これは、クラス自体のために機能しますが、関連するフィールド(foreignまたはmany2many)では使用できません。セットをセットしたにもかかわらず、use_for_related_fields = Trueです。関連分野について

、(例えば、record.managed_set.db_manager(dbname)ため)db_manager(dbname)を付加することなく、追加()方法は、全て()メソッドを固定することができます。

このジャンゴチケットを参照してください、私が何を意味するか理解する:http://code.djangoproject.com/ticket/13358

私はそれがall()のために働くと思うが、ないadd()

関連する問題