--
© 2009-2015 Валерий Бовсуновский - Школа практики Django + Python.
А я говорил нет ничего не ничего не возможного, реальные примеры.
вот одна из функций:
def models_all(request):
qw_models = Model3D.objects.all()
models = get_paginator(request, qw_models) # достаем списки страниц из пагинатора
form = ModelFindForm()
return render_to_response('model_all.html', {'models': models, 'form': form})
форма поиска отправляет запрос на страницу с функцией поиска:
def find_model(request):
if request.method == 'GET':
form = ModelFindForm(request.GET)
if form.is_valid():
form.full_clean()
d = form.cleaned_data
words = d['tag']
stroke, strokes = modify_stroke(words)
qwcategory = Model3D.objects.all() # выборка в которой будет производится поиск
qw, qw_count = get_qwerty(stroke, strokes, qwcategory)
models = get_paginator(request, qw) # достаем списки страниц из пагинатора
form = ModelFindForm()
return render_to_response('models_found.html', {
'form': form, 'models': models, 'qw_count': qw_count,
'words': words, 'qw': qw
})
else:
form = ModelFindForm()
return render(request, 'models_found.html', {'form': form})
else:
form = ModelFindForm()
return render(request, 'models_found.html', {'form': form})
Кстати тут дну вещь заметил метод count() для QuerySet не работает если QuerySet преобраховать во множество а потом обратно в список, требует аргумент как при работе с обычными списками.
поэтому использовал len(QuerySet) - отложил этот момент на попозже.
я таким образом поиск делаю (пока таким):
# преобразование пользовательского ввода
def modify_stroke(words):
words = words.replace('.', ',')
words = words.split(',')
print(words)
stroke = []
strokes = []
for x in words:
x = x.strip()
if ' ' in x:
xx = x.split(' ')
xxx = []
for i in xx:
i = i.replace(' ', '')
if i:
xxx.append(i)
strokes.append(xxx)
else:
x = x.replace(' ', '')
if x:
stroke.append(x)
return stroke, strokes # вывожу список единичных слов и список списков слов (словосочетаний)
делаю выборку преобразовав выборки по ключам в множества с последующим пересечением и объединением
# получение требуемой выборки
def get_qwerty(stroke, strokes, qwcategory):
qw2 = set()
qw3 = set()
if stroke:
for s in stroke:
qw1 = qwcategory.filter(tags__icontains=s)
qw1 = set(qw1)
qw2 = qw1 | qw2
if strokes:
for s in strokes:
qws = []
for i in s:
qw = qwcategory.filter(tags__icontains=i)
qw = set(qw)
qws.append(qw)
qq2 = qws[0]
for s in range(len(qws)):
qw = qws[s]
qq2 = qw & qq2
qw3 = qq2 | qw3
qw = qw2 | qw3
qw = list(qw)
qw_count = len(qw) # Не используйте len() с QuerySet если нужно узнатьколичество записей
# исп-ть оператор SQL SELECT COUNT(*), и Django предоставляет метод count() для этого
return qw, qw_count
--
© 2009-2015 Валерий Бовсуновский - Школа практики Django + Python.
---