Django查询过滤器参数和Q.

时间:2016-09-02 15:08:48

标签: django django-queryset

我试图用一个参数进行django查询过滤,并使用“Q”这样:

            variables = Indicator.objects.filter(
                type = constants_type_indicator_variable.variable,
                        Q(current_state = constants_current_state.valid) | 
                        Q(current_state = constants_current_state.current_registered) | 
                        Q(current_state = constants_current_state.re_opened) | 
                        Q(current_state = constants_current_state.open_registered)
            )

但是我在第一个“Q”行中出现了这个错误:

non-keyword arg after keyword arg

如果我只使用“Q”而没有通过“类型”字段进行过滤,那么它可以正常工作,但它会崩溃......

知道为什么吗?,提前谢谢。

2 个答案:

答案 0 :(得分:1)

试试这个:

 variables = Indicator.objects.filter(

                    Q(current_state = constants_current_state.valid) | 
                    Q(current_state = constants_current_state.current_registered) | 
                    Q(current_state = constants_current_state.re_opened) | 
                    Q(current_state = constants_current_state.open_registered),
                    type = constants_type_indicator_variable.variable,
        )

该错误意味着您已经在非关键字之前传递了kwargs,通常在python函数中,应首先传递非关键字参数,然后传递关键字args。这适用于所有python函数。

这个post对关键字功能参数有很好的解释。

答案 1 :(得分:1)

虽然@ kt14的回答是正确的,但我认为这可以通过使用in而不是Q分离的查询来简化。您可以定义有效状态列表并将其传递给:

valid_states = [
    constants_current_state.valid,
    constants_current_state.current_registered,
    constants_current_state.re_opened,
    constants_current_state.open_registered
]

variables = Indicator.objects.filter(
    type=constants_type_indicator_variable.variable,
    current_state__in=valid_states
)