如何将Django过滤器args作为参数传递给其他函数

时间:2017-10-19 15:54:58

标签: python django

我想创建一个返回过滤器结果的类函数,但是我希望能够像使用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..")

我该如何做到这一点?

1 个答案:

答案 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_compoundTrue(或同时为两者)。

如果您需要逻辑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。与第一个代码片段相比,这是语义不同