Найти - Пользователи
Полная версия: Многострадательный поиск :)
Начало » Django » Многострадательный поиск :)
1 2
pochechyev
Приветствую.
Передо мной стоит задача сделать красивый поиск с использованием джанги.

models.py:
class Film(models.Model):
...
producer=models.ForeignKey(Producer)
genre=models.ForeignKey(Genre)
year=models.ForeignKey(Year)

quality=models.ForeignKey(Quality)

date=models.DateField(auto_now_add=True)
....


class Producer(models.Model):
...
class Year(models.Model):
...
class Quality(models.Model):
...
class Genre(models.Model):
...
так вот по этим самым параметрам (Producer, Year, Genre …. ) и нужно искать, но НЕ все они обязательны для заполнения.
У меня проблема возникает когда я пытаюсь Film передать пустые значения он говорит что такого Producer id (например) не может найти.


В инете ниче найти не могу скорее всего потому что не знаю что именно ищу.


Спасибо за посильную помощь :)
pochechyev
Мне вот только что подсказали что нужен “фасетный поиск” (haystacksearch.org)
Как можно без использования левых приложений сделать тоже самое? Я еще не смотрел но подозреваю что даже 10 части того то запихано в haystack мне не нужно. Да и использовать сторонние приложения не желательно в данном случае.
Александр Кошелев
Вы код покажите, какой вы написали и в котором “возникает проблема”.

По описанию задачи вполне должен подойти обычный filter.
pochechyev
Daevaorn
Вы код покажите, какой вы написали и в котором “возникает проблема”.
class Producer(models.Model):
name=models.CharField(max_length=255)

def __unicode__(self):
return self.name

class Year(models.Model):
year=models.CharField(max_length=4)

def __unicode__(self):
return self.year

class Quality(models.Model):
quality=models.CharField(max_length=10)

def __unicode__(self):
return self.quality

class Genre(models.Model):
genre=models.CharField(max_length=10)

def __unicode__(self):
return self.genre


class Film(models.Model):
name=models.CharField(max_length=255)
orig_name=models.CharField(max_length=255)
producer=models.ForeignKey(Producer)
genre=models.ForeignKey(Genre)
year=models.ForeignKey(Year)
description=models.TextField()
quality=models.ForeignKey(Quality)
translation=models.CharField(max_length=255)
actors=models.CharField(max_length=255)
cover=ImageWithThumbsField(upload_to="uploads/", sizes=((550,435),(1024,768),))
filesize=models.CharField(max_length=10)
date=models.DateField(auto_now_add=True)
tags=models.ManyToManyField(Tag)
file=models.FileField(upload_to=("uploads/%s/%s/%s/" % (d.year, d.month, d.day)))
duration=models.CharField(max_length=30)
audio=models.CharField(max_length=255)
video=models.CharField(max_length=255)
published=models.BooleanField(default=True)
rating=models.CharField(max_length=255, blank=True, null=True)
servers=models.CharField(max_length=255, editable=False, blank=True, null=True)



def __unicode__(self):
return self.name
    <div class="adv_search">
{{hello}}
<form action="/advanced_search/" method="POST">
<p>
<strong>Качество</strong><br>
<select name="quality">
<option></option>
{%for quality in qualities%}
<option>{{quality.quality}}</option>
{%endfor%}
</select>
<input type="submit" value="Искать">
</p>

<hr>
<p>
<strong>Год выпуска</strong><br>
<select name="year">
<option></option>
{%for year in years%}
<option>{{year.year}}</option>
{%endfor%}
</select>
<input type="submit" value="Искать">
</p>

<hr>
<p>
<strong>Режисер:</stong><br>
<select name="producer">
<option></option>
{%for producer in producers%}
<option>{{producer.name}}</option>
{%endfor%}
</select>
<input type="submit" value="Искать">

</p>
<hr>
<p>

<strong>Жанр:</stong><br>
<select name="genre">
<option></option>
{%for genre in genres%}
<option>{{genre.genre}}</option>
{%endfor%}
</select>
<input type="submit" value="Искать">
</p>
<hr>
<p>
<strong>Актер:</stong><br>
<input type="text" name="actor">
<input type="submit" value="Искать">
</p>

<hr><hr><hr>
<p>
{%if results %}
{%for result in results%}
<p><a href="/view/film/{{result.id}}">{{result.name}}</a> | {{result.quality}} | {{result.year}} | {{result.genre}} | {{result.producer}}</p>
{%endfor%}
{%endif%}
</p>
</form>
</div>
Ни одно из полей формы НЕ является обязательным.

Не могу обьяснить по-человечески, постарайтесь понять как есть :)
magasoft
pochechyev
Ни одно из полей формы НЕ является обязательным.
Не могу обьяснить по-человечески, постарайтесь понять как есть
Короче, проблема в том что не известно какие поля будут пользователем заполнены, то бишь по каким он будет искать? В таком случае как обычно надо полученный запрос проверять (что заполнено и что нет) и формировать итоговый запрос к базе, хоть в filter, хоть sql, это уже не суть важно.
Только я не понял зачем вам столько сабмитов в форме?
sairus
Передо мной стоит задача сделать красивый поиск с использованием джанги.
Для красивого поиска можно и Sphinx прикрутить, чтобы поиск полнотекстовым был.

а вообще примерно так должно быть во views.py

search = File.objects.all()

producer = form.POST.get("producer", None)
if producer: search = search.filter(producer__name=producer)
но это если в форме producer представлен в виде <input type=“text” />

у вас это select, причем значение атрибутов тэгов <option> пустые, в вашем случае лучше писать <option value=“{{producer.name}}”>{{producer.name}}</option>,

а вообще почитайте как работать с формами и ORM слоем, потому что ваш подход не для Django.
pochechyev
magasoft
Короче, проблема в том что не известно какие поля будут пользователем заполнены, то бишь по каким он будет искать?
Именно это и нужно.
magasoft
В таком случае как обычно надо полученный запрос проверять (что заполнено и что нет) и формировать итоговый запрос к базе, хоть в filter, хоть sql, это уже не суть важно.
Не круто :) слишком много if else получается. Легко запутаться.
magasoft
Только я не понял зачем вам столько сабмитов в форме?
Это я сейчас так обошел решение вопроса. Поиск сейчас происходит только по одному полю.
sairus
Для красивого поиска можно и Sphinx прикрутить, чтобы поиск полнотекстовым был.
Прикручивания сторонних приложений хотелось бы избежать.
sairus
а вообще примерно так должно быть во views.py
Сейчас где-то так и происходит.
sairus
потому что ваш подход не для Django.
Что именно не django way ?
Ferroman
Не круто smile слишком много if else получается. Легко запутаться.
Цикл?
pochechyev
Ferroman
Цикл?
Не понимаю как такое реализовать в цикле. Можно пример?
Ferroman
Проверки списка однотипных элементов в цикле?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB