3

模型的主要目的是包含业务逻辑,所以我希望我的大部分代码都以方法的形式存在于 django 模型中。例如,我想编写一个名为get_tasks_by_user()inside 任务模型的方法。这样我就可以访问它

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

一个简单的方法是使用classmethod装饰器使其成为类方法。内部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 的发布经理) 关于何时使用管理器/类方法的博客文章。

于 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 回答