当值为列表时在视图过滤器中使用字典

Use dictionary in view filter when value is a list

我在 Django 视图中使用字典作为过滤器,形式如下:

CI_table.objects.values(*report_fields).filter(**report_query_values)

问题是字典有一些值是列表,我得到这个错误: int() 参数必须是字符串或数字,而不是 'list'

我想做的是从 request.POST 创建过滤器,并且表单中的某些字段选择了多个值。 这可能是一种更好的方法,因此如果您有任何不同的建议,我们将不胜感激。

谢谢, 艾萨克

我认为您可以通过简单的检查和将密钥转换为 __in 格式(如果它是列表)来轻松处理此问题:

for key in report_query_values:
    if type(report_query_values[key]) == list:
        report_query_values[key + "__in"] = report_query_values[key]
        report_query_values.pop(key)

这样,如果一个特定的键有多个值,它会被转换成一种 attribute__in 类型的格式,这是您通常使用的格式。

__in 查找添加到具有列表值的字段:

def make_lookup(field, value):
    if isinstance(value, list):
        return '%s__in' % field, value
    return field, value

filter_lookups = dict(make_lookup(k, v) for k, v in
                                        report_query_values.items())

CI_table.objects.values(*report_fields).filter(**filter_lookups)