[英]Multi search query on django 1.3
我正在嘗試在搜索過濾器上實現多於一個列,但是我總是收到查詢錯誤:
這是我的models.py:
class Livro(models.Model):
codigo = models.AutoField(primary_key=True)
nome = models.CharField("Nome", max_length=50)
autor = models.CharField("Autor", max_length=50)
edicao = models.CharField("Edição", max_length=30)
disciplina = models.ForeignKey(Disciplina)
tipo = models.CharField("Tipo", max_length=20, choices = Choices.tipo)
ano = models.CharField("Ano", max_length=30, choices = Choices.ano)
situacao = models.CharField("Situação", max_length=30, choices = Choices.situacao, default = Choices.situacao[0][1], blank = True, null = True)
def __unicode__(self):
return self.nome
這是我的views.py:
def consultar_livro(request):
if request.method == 'POST':
nome = request.POST['nome']
livro = Livro.objects.filter(nome__icontains=nome).order_by('nome')
return render_to_response('consultar_livro.html', locals(), context_instance = RequestContext(request))
我不僅需要使用名稱,還需要使用situacao,disciplina,tipo e ano。 我該怎么辦? 我已經嘗試過像添加名稱一樣添加和使用Q()函數,但是都沒有,如何進行?
從django的內置管理員搜索中獲取,這是一個如何實現此目的的示例。
import operator
def get_search_results(request, queryset, search_term):
"""
Returns a tuple containing a queryset to implement the search,
and a boolean indicating if the results may contain duplicates.
"""
# Apply keyword searches.
def construct_search(field_name):
if field_name.startswith('^'):
return "%s__istartswith" % field_name[1:]
elif field_name.startswith('='):
return "%s__iexact" % field_name[1:]
elif field_name.startswith('@'):
return "%s__search" % field_name[1:]
else:
return "%s__icontains" % field_name
use_distinct = False
search_fields = get_search_fields(request)
if search_fields and search_term:
orm_lookups = [construct_search(str(search_field))
for search_field in search_fields]
for bit in search_term.split():
or_queries = [models.Q(**{orm_lookup: bit})
for orm_lookup in orm_lookups]
queryset = queryset.filter(reduce(operator.or_, or_queries))
if not use_distinct:
for search_spec in orm_lookups:
if lookup_needs_distinct(queryset.model._meta, search_spec):
use_distinct = True
break
return queryset, use_distinct
def get_search_fields(request):
"""
use double underscores to walk relationsships
"""
return (
'nome', 'situacao', 'disciplina__foreign_relation__field',
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.