3

モデルの主な目的はビジネス ロジックを含めることなので、ほとんどのコードを django モデル内にメソッドの形式で収めたいと考えています。たとえば、get_tasks_by_user()タスク モデル内にという名前のメソッドを書きたいとします。としてアクセスできるように

Tasks.get_tasks_by_user(user_id)

以下は私のモデルコードです:

class Tasks(models.Model):
    slug=models.URLField()
    user=models.ForeignKey(User)
    title=models.CharField(max_length=100)
    objects=SearchManager()
    def __unicode__(self):
        return self.title
    days_passed = property(getDaysPassed)
    def get_tasks_by_user(self,userid):
        return self.filters(user_id=userid)

しかし、これはうまくいかないようです。私はそれを次のように使用しました:

    tasks = Tasks.objects.get_tasks_by_user(user_id)

しかし、次のエラーが発生します。

'SearchManager' object has no attribute 'get_tasks_by_user'

を削除するobjects=SearchManagerと、エラーになったマネージャーの名前だけが変更されるので、問題ではないと思います。私は非常に基本的なレベルの間違いをしているようです。何が間違っているのか、どうすればやろうとしているのか教えてください。: を介して同じことができることはわかっていますTasks.objects.filters(user_id=userid)が、そのようなロジックをすべてモデルに保持したいと考えています。ですので、正しい方法を教えてください。

ありがとう

4

2 に答える 2

5

これを行う簡単な方法は、classmethoddecorator を使用してクラス メソッドにすることです。内部class Tasks:

@classmethod
def get_tasks_by_user(cls, userid):
    return cls.objects.filters(user_id=userid)

このようにして、次のように簡単に呼び出すことができます。

tasks = Tasks.get_tasks_by_user(user_id)

または、トムの回答ごとにマネージャーを使用できます。

特定のケースでどちらを選択するかを決定するには、James Bennett (Django のリリース マネージャー) の ブログ記事で、 manager/classmethod をいつ使用するかを参照してください。

于 2012-10-27T21:51:04.117 に答える
4

モデル クラスのメソッドは、そのモデルのインスタンス、つまり個々のオブジェクトでのみ使用できます。

関数をget_tasks_by_user必要に応じて (コレクションで) 使用できるようにするには、モデル マネージャーに実装する必要があります。

class TaskManager(models.Manager):
    def get_tasks_by_user(self, user_id):
        return super(TaskManager, self).get_query_set().filter(user=user_id)

class Task(models.Model):
    # ...
    objects = TaskManager()
于 2012-10-27T21:46:21.637 に答える