Django-如何覆盖模型上的过滤器? [英] Django - How to override filter on a model?

查看:15
本文介绍了Django-如何覆盖模型上的过滤器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我很好奇是否有实现此目的的最佳实践或推荐方法?

假设我有一个这样的模型:

class Cat(models.Model):
    field1=models.CharField(...)
    field2=models.CharField(...)
    evil=models.BooleanField(...)

我试图实现的是,我不希望任何视图能够访问邪恶为真的Cat记录。

我是否真的需要为每个Cat.Objects.Filter调用添加.Filter(邪恶=False),或者有什么方法可以在类中这样做一次,从而使邪恶的猫永远不会出现在任何地方?

推荐答案

好的,自定义管理器可以放在这里。只要看一看docs。正如克里斯·普拉特所说,请记住,第一个管理器将成为默认管理器。

希望这会导致正确的方向。

更新(也许您可以这样做):

from django.db import models

class EvilCategoryManager(models.Manager):
    def get_query_set(self):
        return super(EvilCategoryManager, self).get_query_set().filter(evil=False)

class Cat(models.Model):
    #.... atrributes here
    objects = models.Manager()
    no_evil_cats = EvilCategoryManager()

这篇关于Django-如何覆盖模型上的过滤器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆