Понимание словаря с Q

Допустим, у меня есть следующий фрагмент кода:

      criteria = {'description': 'tt', 'hostname': '2'}
filters = Q()
{filters.add(Q(**{k+'__icontains': v}), Q.AND) for k,v in criteria.items()}

Не могу понять, как избежать удвоения результата:

      {<Q: (AND: ('description__icontains', 'tt'), ('hostname__icontains', '2'))>,
 <Q: (AND: ('description__icontains', 'tt'), ('hostname__icontains', '2'))>}

Я понимаю, что мне нужно сменить Q.AND где-нибудь, не так ли?

1 ответ

Похоже, вы проверяете полученный setиз набора понимания, в котором перечислены одни и те же Qобъект ( filters) дважды, после того как он был изменен. На самом деле это не проблема — вы нигде не используете полученный набор, но это выглядит немного удивительно.

В качестве альтернативы должна быть возможность пройти все kwargsты хочешь Q()на одном дыхании:

      criteria = {'description': 'tt', 'hostname': '2'}
filters = Q(**{k + '__icontains': v for k, v in criteria.items()})

Это устраняет необходимость в установленном понимании.

Другие вопросы по тегам