2009-06-24 10 views
1

これはDjangoウィザードの質問です。Django Object Managerの問題

class MyObjManager(models.Manager): 

    def total_values(self, myobj_id): 
       return 49 

    def what_the_heck(self, poll_id): 
       return 48 

class TestMe(): 

     def what_the_heck(self, poll_id): 
       return 47 

を今、私は動作するようには思えない、次のようにこのオブジェクトマネージャを使用するモデルを作成する場合、次のように私はラインに沿って、オブジェクトマネージャの何かを継承しています。

class MyObj(models.Model): 
    x = models.CharField(max_length=200) 
    y = models.DateTimeField('date published') 
    objects = MyObjManager() 
    kb = MyObjManager() 
    testMe = TestMe() 

    def total_values(self):  
     #A return self.objects.total_values(1) 
      #B return self.objects.yyy(1) 
      #C return self.kb.what_the_heck(1) 
      #D return 50 
      #E return self.testMe.what_the_heck(1) 
      #F return self.objects.what_the_heck(1) 

ここで、A、B、C、D、Eがそれぞれ1つずつコメントアウトされているとします。 myObj.total_valuesを呼び出すと結果は次のようになります。 (ここで、このmyobjはこのmyobjのインスタンスである) A)なし B)なし C)なし D)50 E)47 F)私は、この例では2つのオブジェクトマネージャを使用した

何も、同じ私は1つしか使用しないと事が起こります。なぜオーバーライドされたオブジェクトマネージャのメソッドにアクセスできないのかについての洞察はありますか?

+0

"NameError"。 "id"とは何ですか?それは "self.id"であってはなりませんか? "B"と記されたステートメントで、この "yyy()"メソッドはどこに定義されていますか?また、 "total_votes()"はどこに定義されていますか? – ayaz

+0

私はIDを修正しました(私はこの記事のリファクタリング中にそれを逃しました)。 yyyは定義されていませんが、エラーを起こすことはありません。 – Daniel

答えて

0

はそれがPollManagerが実際にMyObjManagerから継承されているかどうかは不明です。あなたのクラスのPollManagerと呼ぶことを意味しますか?

EDIT:あなたはMyObjManagerのコンストラクタを作成してみてください。それはマネージャのコンストラクタを呼び出すでしょう。

def __init__(self): 
    models.Manager.__init__(self) 

これが機能するかどうかを確認してください。インスタンスマネージャのメソッドを持っていないA、B、及びCは、あなたはそれがインスタンスメソッドである...自己を使用することができない、自己がそのインスタンスを参照するため

+0

ありがとうございます。私はこの例をリファクタリングして、PollManagerへの参照を見落としました。私は質問を編集しました。 – Daniel

+0

私が考えることができるのは、あなたがManagerを正しくインポートしていないということだけです。 – AlbertoPL

+0

しかし私は、これはあなたが必要なだけインポートする必要があり、あなたの輸入は、あなたのコードから見てどのように言うことができない:django.db輸入モデル – AlbertoPL

3

...。

EとFの作業もう一度、あなたが適切な属性を宣言しているのインスタンスメソッドを呼び出すされているからです。 A、B、Cについては

、このmyobj

class MyObj(models.Model): 
    x = models.CharField(max_length=200) 
    y = models.DateTimeField('date published') 
    objects = MyObjManager() 
    kb = MyObjManager() 
    testMe = TestMe() 

    def total_values(self):    
     #A return MyObj.objects.total_values(1) 
     #B return MyObj.objects.yyy(1) 
     #C return MyObj.kb.what_the_heck(1) 
     #D return 50 
     #E return self.testMe.what_the_heck(1) 
     #F return self.objects.what_the_heck(1) 

で自己を置き換える私はあなたがモデルのインスタンスを見つけるだろうシナリオの苦労の思考を持っているし、次に取得するためにその上で関数を呼び出しますそのモデルの他のインスタンスは、しかし...(私はあなたのアプローチは、あなたがより良い答えを得るのを助けるかもしれないあなたのより大きな範囲の問題を述べ、厄介または不正確であるかもしれないことを示唆しています。)文は「」生成する必要が記さ

+0

お返事ありがとうございます。 E)は 'objects'と同じ方法で宣言された 'testMe'を使用しますが、構文は正常に機能しているようです(self.testMe.what_the_heck(1)は47を返します)。だから私はあなたが欠けているものがなければ、A、B、Cは自己を使うことができないと言っても間違いないと思う。 – Daniel

+0

私は、より大きな範囲が明確になることは完全に同意しますが、それはおそらくこの膨大な疑問を冒すだろう:)。私はちょうどこの確かに考案された例で物事を蒸留しようとしました。 – Daniel

+1

魔法は、models.Managerから継承するときに発生します。 – phillc