簡體   English   中英

Django 1.3上的多搜索查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM