【问题标题】:Django custom queryset with pre-filter带有预过滤器的 Django 自定义查询集
【发布时间】:2025-12-07 17:15:01
【问题描述】:

在 django 中有没有一种方法可以编写一个自定义查询集类,该类具有“预先应用”的过滤器,而无需对其调用方法?

我想使用QuerySet.as_manager() 创建一个经理。但我希望那个经理自动过滤掉一些条目。

【问题讨论】:

    标签: django django-managers


    【解决方案1】:

    Django 为您提供了两种为模型编写海关管理器的方法。 第一个是这样调用的:MyModel.objects.my_manager()。 最后一个是这样调用的:MyModel.my_manager.all()

    我会告诉你最后一个,因为它很容易实现。

    让我们假设这个模型

    class Post(models.Model):
        title = models.CharField(max_length=30, default='')
        description = models.CharField(max_length=30, default='')
        published = models.BooleanField(default=True)
        
        objects = models.Manager() # The default manager.
        published = PublishedManager() # Yur custom manager.
    

    现在有一个只返回published Post 的经理:

    class PublishedManager(models.Manager):
        def get_queryset(self):
            return super(PublishedManager,self).get_queryset()\
            .filter(published=True)
    

    从这里,您可以像这样执行查询集: published_posts = Post.published.all() 或对其应用一些过滤器,例如: published_posts = Post.published.all().order_by('-title')

    注意:经理定义在 Post 模型之前。

    另一种方式与经理Django Doc打交道

    【讨论】:

    • 我要做的是实现从自定义查询集创建管理器的 DRY 好处,以便您的管理器和查询集可以轻松地使用相同的链接方法。但我也希望能够像您一样使用get_queryset() 进行预过滤。这有意义吗?
    最近更新 更多