Пользователь вводит различные критерии поиска. Если он их вводит - то ищем по этим критериям(принимают участие в select -filter посредством Q)
Если не вводит - то по ним не ищем.
Запрос вида select * from table_name where col1=val1 and col2=val2 and ….. and coln in ()… and ….
Как сие правильно перевести на джанговский ORM?
Пока что делаю тупым путём.
if q_1:
location_str = "Q(location__in=[%s])," % ",".join([str(cur.id) for cur in q_1])
if sform.cleaned_data['has_photo']:
photo_str = "~Q(ph1='') | ~Q(ph2='') | ~Q(ph3='') | ~Q(ph4=''),"
if sform.cleaned_data['description']:
descr_str = "Q(description__contains=sform.cleaned_data['description']),"
if sform.cleaned_data['publisher']:
publisher_str = "Q(user_id=sform.cleaned_data['publisher'].id),"
......................
exec("""q_object = Object.objects.filter(
%(location_str)s
%(photo_str)s
%(descr_str)s
%(publisher_str)s
.................
)""" % { 'location_str': location_str, 'descr_str': descr_str, 'publisher_str': publisher_str, 'photo_str': photo_str, ...}
)
Может нехватает знания языка… Думал сделать с помощью распаковки аргументов ** или * , да вот в качестве каждого аргумента идёт Q или ~Q….
Кто-то просто-тки должен был столкнуться с такой проблемой.
Буду очень благодарен за помощь. Или хотя бы за намёк, в какую сторону копать.