Как назначить массовый параметр в список значений объектов Django?
Как назначить массовые параметры в список значений объектов Django?
Bulk parameter assignment
strlist = ["a","b","c"]
model1. objects.filter(**kwargs).values_list(strlist)
Result: TypeError: unhashable type: 'list'
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