【发布时间】:2025-12-07 17:15:01
【问题描述】:
在 django 中有没有一种方法可以编写一个自定义查询集类,该类具有“预先应用”的过滤器,而无需对其调用方法?
我想使用QuerySet.as_manager() 创建一个经理。但我希望那个经理自动过滤掉一些条目。
【问题讨论】:
在 django 中有没有一种方法可以编写一个自定义查询集类,该类具有“预先应用”的过滤器,而无需对其调用方法?
我想使用QuerySet.as_manager() 创建一个经理。但我希望那个经理自动过滤掉一些条目。
【问题讨论】:
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打交道
【讨论】:
get_queryset() 进行预过滤。这有意义吗?