可以覆盖Django模型中的.objects吗?
我想默认只返回“已发布”的实例,也就是那些 published=True 的。有没有办法可以重写 .objects 这样 MyModel.objects.all() 实际上返回的是 MyModel.objects.filter(published=True) 呢?
这样做合理吗?如果我偶尔需要获取未发布的实例,我该怎么做呢?
1 个回答
35
你可以通过写一个自定义的管理器来实现这个功能——只需要重写一下get_queryset
方法,然后把你的objects
设置为一个管理器实例。比如:
class MyModelManager(models.Manager):
def get_queryset(self):
return super(MyModelManager, self).get_queryset().filter(published=True)
class MyModel(models.Model):
# fields
# ...
objects = MyModelManager()
想了解更多细节,可以查看文档。如果这是你常用的默认情况,那这样做是很合理的。要获取未发布的内容,可以创建另一个管理器,然后通过类似MyModel.unpublished_objects
的方式来访问它。同样,文档中也有这方面的例子。