Как назначить массовый параметр в список значений объектов Django?

Как назначить массовые параметры в список значений объектов Django?

  1. Bulk parameter assignment

    strlist = ["a","b","c"]

    model1. objects.filter(**kwargs).values_list(strlist)

    Result: TypeError: unhashable type: 'list'

  2. Manual assignment

    model1. objects.filter(**kwargs).values_list("a","b","c")

    Result is ok

Как назначить массовое назначение параметров?

Короткий ответ:
Попытка:

model1. objects.filter(**kwargs).values_list(*strlist)

Объяснение:
. Проблема заключается в том, что функция требует ввода неупакованных значений. Существует разница между list и *list. *list представляет собой распаковку отдельных значений внутри списка, а затем их ввод.
Итак,

model1. objects.filter(**kwargs).values_list(strlist)

интерпретируется как

model1. objects.filter(**kwargs).values_list(["a", "b", "c"])

Но

model1. objects.filter(**kwargs).values_list(*strlist)

интерпретируется как

model1. objects.filter(**kwargs).values_list("a", "b", "c")

Пример 1:

a = [1,2,3,4]
print(a)
print(*a)

Выход:

[1, 2, 3, 4]
1 2 3 4

Таким образом, если a представляет список a, но в форме списка, то *a представляет список a в виде отдельных элементов. Следовательно, даже если вы попытаетесь проиндексировать *a, он выдаст ошибку.
С другой стороны, **dict1 относится к сценарию, когда словарь dict1 содержит аргументы в виде пар ключ-значение. Например:

def b(hel, lo, wo, rl):
    print(hel, lo, wo, rl)

a = [1,2,3,4]
d = {'hel':1, 'lo':2, 'rl':3, 'wo':4}
b(*a)
b(**d)

Выход:

1 2 3 4
1 2 4 3
Вернуться на верх