可以覆盖Django模型中的.objects吗?

12 投票
1 回答
11644 浏览
提问于 2025-04-16 10:23

我想默认只返回“已发布”的实例,也就是那些 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的方式来访问它。同样,文档中也有这方面的例子。

撰写回答