2009-05-09 13 views
1

私はDjangoで作業しています。モデル上で動作するメソッドを配置する場所

私はAgrumentというモデルを持っています。議論には側と所有者がいる。私は特定のユーザーの最新の議論の側面を返す関数を持っています。

私はそこではないかもしれないので、私は、これは意味がありません考え始めています。この

def get_current_side(self, user): 
     return self.argument_set.latest('pub_date').side 

のような実引数モデルにこれを追加しましたobj.get_current_side(ユーザー名)

よう

引数のインスタンスこれはクラスメソッドを使用する場所ですか?私はutilクラスを作ることを考えましたが、私はそれがArgumentクラスに関連付けられていると考えています。

答えて

0

あなたが探しているのはモデルマネージャーだと思います。

Django docs on managersマネージャを使用すると、モデルインスタンスではなくモデルクラスに関数を追加できます。

2

それは、Userモデルのインスタンスメソッドを持っているために、より理にかなって:

def get_current_side(self): 
    try: 
     return self.arguments.latest('pub_date').side 
    except User.DoesNotExist, e: 
     return None 

ここで説明したようにあなたがUserモデルを拡張することにより、これを行うことができます。

編集:どの例外がスローされるのか正確にはわかりません。あなたcontrib.auth.userを拡張し、その上にget_current_size()を追加することができます

# in models.py 
class ArgumentManager(models.manager.Manager): 
    def get_current_side(self, user): 
     try: 
      return self.filter(user=user).latest('pub_date').side 
     except Argument.DoesNotExist: 
      return None 

class Argument(models.Model): 
    # fields etc... 

    objects = ArgumentManager() 


# Calling: 

side = Argument.objects.get_current_side(user) 

Alternaticely:

1

は、これは、カスタムモデル管理上の方法でなければなりません。しかし、私はDjangoに非常に自信が持てるまで、私はそれを混乱させません。

ところで:このページのコードの大部分は間違っています。たとえば、user変数はOPのスニペットではまったく使用されません。