Django - 如何覆盖模型上的过滤器?

Gre*_*reg 5 django django-models django-orm

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

说我有这样的模型:

class Cat(models.Model):
    field1=models.CharField(...)
    field2=models.CharField(...)
    evil=models.BooleanField(...)
Run Code Online (Sandbox Code Playgroud)

我想要完成的是我不希望任何视图能够访问邪恶为真的Cat记录.

我是否真的需要在每个Cat.objects.filter调用中添加.filter(evil = False),或者是否有某种方法可以在课堂上执行此操作并使邪恶的猫从未出现在任何地方?

Jin*_*ngo 8

好的,自定义经理可以适应这里.只需看看文档.就像克里斯普拉特所说的那样,请记住第一位经理成为默认经理.

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

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

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()
Run Code Online (Sandbox Code Playgroud)

  • 为什么不直接返回`super(EvilCategoryManager, self).filter(evil=False)`? (2认同)
  • 你需要覆盖 ```get_queryset``` 而不是 ```get_query_set``` (2认同)