2016-12-02 99 views
0

我試圖做我的搜索過濾器來實現多列,但我總是得到一個錯誤的查詢回:多的搜索查詢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ēANO的。我應該怎麼做?我已經嘗試過,只需添加像名稱一樣的名稱並使用Q()函數,但它不會如何繼續?

+0

什麼錯誤? 「不包含」是什麼意思? – Sayse

回答

0

來自django's builtin管理員搜索這裏是一個如何實現這個目標的例子。

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', 
    )