Django全局过滤器

时间:2019-01-17 16:39:27

标签: python django filter global

是否可以全局过滤Django模型?我们需要在单个位置设置一个过滤器,以便将其应用到Django ORM生成的所有查询中,包括相关对象查找等。示例:

class A(Model):
    n = IntegerField()

class B(Model):
    a = ForeignKey(A)

我们要在A上设置一个全局过滤器id__gte = 10(为简单起见,它是静态的)。然后,在进行相关查询时(例如,

B.objects.filter(a__n=123)  # this code cannot be modified

应该以某种方式神奇地扩展到

B.objects.filter(a__n=123, a__id__gte=10)

我们可以更改模型,管理器,查询集,但不能更改实际查询对象的代码(很多代码,第三方应用程序,通用API)。

2 个答案:

答案 0 :(得分:0)

如何在带有过滤器的数据库中创建视图并创建指向该视图的Django模型?

答案 1 :(得分:0)

您应该创建一个自定义管理器并修改一个初始QuerySet。检出the docs

# First, define the Manager subclass.
class DahlBookManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(author='Roald Dahl')

# Then hook it into the Book model explicitly.
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

    objects = models.Manager() # The default manager.
    dahl_objects = DahlBookManager() # The Dahl-specific manager.

然后,您应该使用自定义管理器(dahl_objects)而不是objects,所有查询都会被修改。

或者您可以覆盖objects经理本身

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

    objects = DahlBookManager() # The Dahl-specific manager