Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 18, 2013 09:44:09

rss
Зарегистрирован: 2013-09-28
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Порекомендуйте простой поиск

Новичок. Целый день читаю, никак не пойму главного. Что лучше?
Нужны(то что и хотелось бы): простые выборки(поиск) из базы, типа как тут http://est.ua/
…не включая полнотекстный поиск…
Если я правильно понимаю - полнотекстный - это поиск из TextField или CharField.

Что лучше, быстрее и проще реализовать:
.просто собрать самому (или потом придется дописывать и дописывать, что в итоге лучше бы воспользовался чем-то готовым)
.Django-Sphinx - тут не понятно, слово - полнотекстный - т.е. Возможно ли также просто реализовать то что я хочу
.Django-haystack - вроде как все есть, но все то и не надо, надо только то что хотелось бы и быстрее, проще и пр.
.или еще что-то

Гуру подскажи, в какую сторону потратить время?
Спасибо

Офлайн

#2 Ноя. 18, 2013 11:41:06

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Порекомендуйте простой поиск

На самом деле такая фильтрация делается очень просто.
Смотрите какая идея

#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})



Офлайн

#3 Ноя. 21, 2013 17:13:20

rss
Зарегистрирован: 2013-09-28
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Порекомендуйте простой поиск

Просто отлично! Спасибо!

Подскажите, еще с MultipleChoiceField, в этой же конструкции… если скажем у City, есть еще список районов, поиск по которым MultipleChoiceField

district__id = forms.ModelMultipleChoiceField(querysetistricts.objects.all(), widget=forms.CheckboxSelectMultiple,)

Отредактировано rss (Ноя. 21, 2013 18:07:24)

Офлайн

#4 Ноя. 21, 2013 18:53:13

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Порекомендуйте простой поиск

Вам поможет функция Q и операторы | и &
комбинируя их Вы сделаете почти всё



Офлайн

#5 Ноя. 25, 2013 13:25:24

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Порекомендуйте простой поиск

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)

Офлайн

#6 Ноя. 25, 2013 14:39:02

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Порекомендуйте простой поиск

Простится такое решение

f = field_value if isinstance(field_value, list) else [field_value] 
ored = reduce(operator.or_, [Q(**{field_name: value}) for value in f]



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version