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

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

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

【问题讨论】:

    标签: python django filtering


    【解决方案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'
    猜你喜欢
    • 1970-01-01
    • 2012-05-04
    • 2012-09-18
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    相关资源
    最近更新 更多