1. Jury Koryakov

    04.03.2010

    0 ↑
    0 ↓
    Q в QuerySet запросах является отличным инструментом, но возникла задача подставлять поля.

    Например, идёт фильтрация по нескольким полям.
    На входе имеем имена полей и строки поиска:
    f_dict = {'name': 'name_search_text', 'note': 'note_search_text'}
    Хочется сделать запрос
    Q(name__icontains='name_search_text') AND Q(note__icontains='note_search_text')
    но автоматически:
    query = Q()
    for f in f_dict:
    query = query AND Q( f = f_dict[f] ) # так конечно нельзя, здесь ошибка
    Можно конечно if'ами, но некрасиво ужасно.

    Как поступить в такой ситуации? Сталкивался ли кто-нибудь?
  2. Насколько я понял, вам просто нужно разобраться с формой записи аргументов *args, **kwargs.

    Например:

    Q(**{'%s__icontains' % field: value})
    
  3. admin

    04.03.2010

    2 ↑
    0 ↓
    f_dict = {'name': 'name_search_text', 'note': 'note_search_text'}
    predicate = 'icontains'
    query_dict = dict([('%s__%s' % (field, predicate), value)
    for field, value in f_dict.items()])
    some_query_set.filter(**query_dict)
  4. Jury Koryakov

    04.03.2010

    0 ↑
    0 ↓
    Владимир, admin, большое спасибо!

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.