您的方法是错误的,因为您只能在从数据库中检索数据时使用 Model.Manager,因此使用两个管理器或尝试在查询集上使用一个管理器会导致错误。
data = SomeModel.objects.my_manager.all()
或
data = SomeModel.objects.all()
data = data.my_manager.filter(...)
这是错误的,因为您不能使用两个管理器...
一种可能的方法是定义一个函数,该函数将查询集作为参数并返回过滤后的查询集...
def extra_filter(queryset):
queryset = queryset.filter(...)
但我不确定这是否有帮助。
最好的方法是定义另一个模型管理器,并在需要时将其用于对象...
class SomeManager(models.Manager):
def get_query_set(self):
return super(SomeManager, self).get_query_set().filter(<filteer criteria>)
class MyModel(models.Model):
# some fields
objects = models.Manager()
mymanager = SomeManager()
data = MyModel.mymanager.all()
只用一个...
更新:在 django 中,查询集是惰性的。这意味着,您可以应用任意数量的过滤器,除非您尝试从过滤器中获取特定记录或尝试对其进行切片,否则不会从数据库中检索数据...Documentation is here
所以,没有区别
qs = MyModel.objects.filter(field_B__lt=1)
qs = qs.filter(field_A__gt=3)
和
qs = MyModel.objects.filter(field_A__gt=3)
qs = qs.filter(field_B__lt=1)
所以定义一个经理来应用一个特定的过滤是使用经理的主要原因...
你定义你的经理:
class SomeManager(models.Manager):
def get_query_set(self):
return super(SomeManager, self).get_query_set().filter(field_A__gt=3)
然后你用其他过滤条件调用它:
Somemodel.mymodelmanager.filter(field_B__lt=1, ....)
django 将添加所有过滤器并在您希望查询时评估查询。
所以如果是你经常使用的过滤器,manager i 是最好的选择……
举个例子,我的大多数数据库模型中都有 valid_ 字段和一个过滤无效条目的 val 管理器。因此,当我希望过滤所有有效数据(90% 的时间)时,我使用
Somemodel.val.filter(...)
在我需要所有数据的情况下,我只使用基本的 django 管理器:
Somemodel.objects.filter(...)