是否有可能在django模型上覆盖.objects?

时间:2011-01-21 18:40:21

标签: python django filtering

我想默认只返回“已发布”实例(published = True)。是否可以覆盖.objects以便MyModel.objects.all()实际返回MyModel.objects.filter(published = True)?

这是明智的吗?在极少数情况下,如果我想要它们,我怎么能得到未发表的?

1 个答案:

答案 0 :(得分:16)

您可以通过编写自定义Manager来执行此操作 - 只需覆盖get_queryset方法并将objects设置为Manager实例即可。例如:

class MyModelManager(models.Manager):
    def get_queryset(self):
        return super(MyModelManager, self).get_queryset().filter(published=True)

class MyModel(models.Model):
    # fields
    # ...

    objects = MyModelManager()

有关详细信息,请参阅docs。如果这将是你通常的默认情况,这是明智的。要取消发布,请创建另一个管理员,您可以使用MyModel.unpublished_objects之类的内容访问该管理员。同样,文档中有关于此类事物的示例。