【问题标题】:Getting syntax error when passing **kwargs to django filter将 **kwargs 传递给 django 过滤器时出现语法错误
【发布时间】:2018-08-11 03:48:13
【问题描述】:
    make_option(
        '--file',
        action='store',
        dest='in_file',
        help="File to process"),
    make_option(
        '--filter',
        action='store',
        dest='filter',
        help="Filter by a store object")

def run(self, *args, **kwargs):
    with open(kwargs['in_file']) as csvfile:
        reader = csv.reader(csvfile, delimiter=',')
        for row in reader:
            filter_store = row[0] #123123
            update_store = row[1]
            Store.objects.filter(**kwargs['filter'] = filter_store).update(**kwargs['update'] = update_store)

这不包括完整的代码^

我正在尝试使用通过存储的 kwargs 传递的商店 ID 过滤数据库,但出现语法错误。

Store.objects.filter(**kwargs['filter'] = filter_store)

基本上**kwargs['filter'] 这里有“id”值,filter_store 有商店 ID。它应该使用**kwargs 执行以下操作:

Store.objects.filter(id = 4334225)

【问题讨论】:

    标签: python django object filter keyword-argument


    【解决方案1】:

    **kwargs 不是这样工作的。在这种情况下,kwargs 应该是一个将参数映射到值的字典。

    但是我们可以构造这样的字典,用:

    some_dict = { kwargs['filter']: filter_store }
    

    然后:

    Store.objects.filter(**some_dict)
    

    或者我们可以将两者结合在一个一个衬里

    Store.objects.filter(**{kwargs['filter']: filter_store })
    

    但请注意,如果 kwargs 包含用户传递的数据,这可能意味着安全威胁,因为它可能 - 至少在理论上 - 允许黑客过滤敏感数据,从而从要隐藏的数据库中获取数据。比如说你想隐藏一个商店的银行账户信息,那么黑客可以使用iban__lts的序列对该商店的IBAN号进行二分查找。

    【讨论】:

      猜你喜欢
      • 2016-12-11
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多