是否可以在 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?的主要内容,如果未能解决你的问题,请参考以下文章