我想创建一个返回过滤器结果的类函数,但是我希望能够像使用django过滤器一样使用它:
这是我尝试过的:
def section_set_with_compound(self, *args, **kwargs):
print args
print kwargs
return self.section_set.filter(Q(args) |Q(course__is_compound=True))
但我得到一个错误,好像args和kwags是空的:
我希望能够做到:
myobject.section_set_with_compound(param1=1,param2__param3__=x,param4__icontains="ha..")
我该如何做到这一点?
答案 0 :(得分:1)
您还需要在*
的调用中使用星号和双星号(Q
):
def section_set_with_compound(self, *args, **kwargs):
return self.section_set.filter(Q(*args, **kwargs) | Q(course__is_compound=True))
args
是带有未命名参数的元组,kwargs
是带有名为参数的字典。但是如果你想再次将它们作为未命名和命名的参数传递,你也需要使用星号进行调用。
请注意,您已经构建了逻辑OR ,这意味着元素或应该满足使用您使用的参数的过滤器,或 course__is_compound
为True
(或同时为两者)。
如果您需要逻辑AND ,可以使用:
def section_set_with_compound(self, *args, **kwargs):
return self.section_set.filter(*args, course__is_compound=True, **kwargs)
现在Django将过滤行,以便您输入的所有条件成立,和 course__is_compound
设置为True
。与第一个代码片段相比,这是语义不同。