我在以下视图中有一个QuerySet。我希望能够在其他视图中使用相同的查询,但我不想复制和粘贴代码。这也感觉我会违反DRY校长。
如果我想在以后修改查询,我将不得不在我的所有视图中更改它,这显然不太理想。我是否应该在我的模型中创建一个类或一个方法,让我从许多不同的视图中调用它?有没有关于此的最佳做法?
tasks = Task.objects.filter(user = request.user).order_by('-created_at', 'is_complete')
答案 0 :(得分:3)
其中一个解决方案是在模型上创建一个类方法或扩展模型的管理器。
from django.db import models
添加classmethod
class MyModel(models.Model):
@classmethod
def get_user_tasks(cls, user):
return cls.objects.filter(...).order_by(...)
覆盖经理
class MyModelManager(models.Manager):
def get_user_tasks(self, user):
return self.filter(...).order_by(...)
class MyModel(models.Model):
objects = MyModelManager()
# and in the view...
queryset = MyModel.objects.get_user_tasks(request.user)