2015-10-18 2 views
0

Я новичок в django и пытаюсь отфильтровать несколько полей, содержащих текст.Django Q set too many values ​​to unpack

columns = ['ticketId', 'checkSum'] 
q_objects = [Q(fieldname +'__contains', myString) for fieldname in columns] 
objects = objects.filter(reduce(operator.or_, q_objects)) 

Я получаю Тип Exception: ValueError Исключения Значения: слишком много значений для распаковки на "фильтр" последнюю строку. Любые идеи

+0

Можете ли вы опубликовать трассировку стека? Я думаю, что ваша проблема, вероятно, будет в строке выше, где экземпляр объекта 'Q' выглядит неправильно. Это должно быть 'Q (** {fieldname + '__ contains': myString})' - передача двух отдельных аргументов по мере того, как вы делаете, не будет работать. – solarissmoke

ответ

0

Попробуйте это:

Q(**{fieldname + '__contains': myString}) 

Это эквивалентно обеспечению ключевого слова аргумент, как обычно, когда создание объекта Q. Например:

Q(fieldname__contains=myString, another_fieldname__contains=myOtherstring) 

Объект Q по существу требует пары значений для работы. Глядя на код, кажется, вы также можете использовать кортежи длиной два, как это (я еще не тестировал):

Q(("fieldname__contains", myString), ("another_fieldname__contains", myOtherString)) 
0

Какова модель, которую вы запрашиваете? Похоже, ты оставил это.

Последняя строка,

objects = objects.filter(reduce(operator.or_, q_objects)) 

Должно быть что-то вроде

objects = MyModel.objects.filter(...)