我想写一个过滤器,然后到处重复使用,我该怎么做?
例如:有一个带有标志 Student
的模型 field
。我想写一个过滤器来获取非研究生( flag=0
)。但是在很多 View 和函数中我们需要列出非研究生,我很懒,不想在这些 View 和函数中一遍又一遍地编写过滤器,因为这样会很难维护源代码。
我可以在模型学生中使用元吗?我没有找到任何与过滤器相关的元选项。或者我可以编写一个函数来过滤模型学生吗?在我看来,模型中的函数只适用于一个 Student 对象而不是列表。
最佳答案
您可以使用自定义管理器来保持干燥并增强可读性(明确命名的过滤器总是比拖动复杂的过滤器更好)
class GraduateManager(models.Manager):
def get_queryset(self):
return super(GraduateManager, self).get_queryset().filter(graduated=True)
class UndergraduateManager(models.Manager):
def get_queryset(self):
return super(Undergraduate, self).get_queryset().filter(graduated=False)
class Student(models.Model):
graduated = BooleanField()
graduates = GraduateManager()
undergraduates = UndergraduateManager()
要使用它,您将获得一个可以根据需要进行操作的普通查询集
Student.graduates.all(), or .filter(), or .count() etc
引用 https://docs.djangoproject.com/en/1.8/topics/db/managers/#modifying-initial-manager-querysets