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

Posted

技术标签:

【中文标题】是否可以在 django 模型上覆盖 .objects?【英文标题】:Is it possible to override .objects on a django model? 【发布时间】:2011-06-13 08:21:20 【问题描述】:

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

这合理吗?在极少数情况下我确实想要未发布的,我该如何获得它们?

【问题讨论】:

【参考方案1】:

您可以通过编写自定义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 之类的内容访问该管理员。同样,文档也有此类事情的示例。

【讨论】:

完全正确的答案。应该标记为正确的@willcritchlow ! MyModel更新寄存器怎么样?当我尝试这样做时,我收到object has no attribute 'bulk_update'

以上是关于是否可以在 django 模型上覆盖 .objects?的主要内容,如果未能解决你的问题,请参考以下文章

Django 模型:覆盖字段返回值

如何从 Django 模型(覆盖)save() 函数向视图发送警报或消息?

覆盖 Django 模型 __init__ 方法

是否可以使用自定义方法/属性覆盖外键关系

如何在 Django 中使用不同的设置进行单元测试?

是否可以在另一台服务器上存储一个特定的 Django 模型/Postgresql 表?