Форум сайта python.su
Новичок. Целый день читаю, никак не пойму главного. Что лучше?
Нужны(то что и хотелось бы): простые выборки(поиск) из базы, типа как тут http://est.ua/
…не включая полнотекстный поиск…
Если я правильно понимаю - полнотекстный - это поиск из TextField или CharField.
Что лучше, быстрее и проще реализовать:
.просто собрать самому (или потом придется дописывать и дописывать, что в итоге лучше бы воспользовался чем-то готовым)
.Django-Sphinx - тут не понятно, слово - полнотекстный - т.е. Возможно ли также просто реализовать то что я хочу
.Django-haystack - вроде как все есть, но все то и не надо, надо только то что хотелось бы и быстрее, проще и пр.
.или еще что-то
Гуру подскажи, в какую сторону потратить время?
Спасибо
Офлайн
На самом деле такая фильтрация делается очень просто.
Смотрите какая идея
#models.py class City(models.Model): name = models.CharField(..) class MyModel(models.Model): city = models.ForeignKey(City) cost = models.IntegerField()
#forms.py class MyModelForm(forms.Form): city__id = forms.ChoiceField(choices = [ (x.id, x.name) for x in City.objects.all()] ) cost__gt = forms.IntegerField() cost__lte = forms.IntegerField()
#views.py form = MyModelForm(request.GET) query = MyModel.objects.all() if form.is_valid(): for field_name, value in form.cleaned_data.items(): query = query.filter(**{field_name: value})
Офлайн
Просто отлично! Спасибо!
Подскажите, еще с MultipleChoiceField, в этой же конструкции… если скажем у City, есть еще список районов, поиск по которым MultipleChoiceField
district__id = forms.ModelMultipleChoiceField(querysetistricts.objects.all(), widget=forms.CheckboxSelectMultiple,)
Отредактировано rss (Ноя. 21, 2013 18:07:24)
Офлайн
Вам поможет функция Q и операторы | и &
комбинируя их Вы сделаете почти всё
Офлайн
FishHook
класный трюк, сейчас как раз понадобилось, заюзал, спсб
rss
тоже юзаю MultipleChoiceField
сделал по быстрому так, может можно по-красивше
for field_name, field_value in form.cleaned_data.items(): if type(field_value) == list: ored = None for value in field_value: if ored: ored |= Q(**{field_name: value}) else: ored = Q(**{field_name: value}) if ored: query = query.filter(ored) else: query = query.filter(**{field_name: field_value})
Отредактировано bismigalis (Ноя. 25, 2013 13:39:42)
Офлайн
Простится такое решение
f = field_value if isinstance(field_value, list) else [field_value] ored = reduce(operator.or_, [Q(**{field_name: value}) for value in f]
Офлайн