【发布时间】:2011-06-13 08:21:20
【问题描述】:
我希望默认情况下只返回“已发布”实例 (published=True)。是否可以覆盖 .objects 以便 MyModel.objects.all() 实际上返回 MyModel.objects.filter(published=True)?
这合理吗?在极少数情况下我确实想要未发布的,我该如何获得它们?
【问题讨论】:
我希望默认情况下只返回“已发布”实例 (published=True)。是否可以覆盖 .objects 以便 MyModel.objects.all() 实际上返回 MyModel.objects.filter(published=True)?
这合理吗?在极少数情况下我确实想要未发布的,我该如何获得它们?
【问题讨论】:
您可以通过编写自定义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 之类的内容访问该管理员。同样,文档也有此类事情的示例。
【讨论】:
MyModel更新寄存器怎么样?当我尝试这样做时,我收到object has no attribute 'bulk_update'