Como fazer pesquisas em modelos?

16 views
Skip to first unread message

Fellipe Henrique

unread,
Apr 2, 2013, 3:18:09 PM4/2/13
to django...@googlegroups.com
Olá amigos, estou querendo montar um template onde o cliente escolhe o campo que deseja buscar e chama uma view para retornar os dados dessa busca, qual a melhor forma de fazer isso? Podem exemplificar para mim?

Obrigado,

T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

"Quemadmodum gladius neminem occidit, occidentis telum est." (Epistulae morales ad Lucilium, Lucius Annaeus Seneca)

"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." 
Albert Einstein (March 14th 1879 – April 18th 1955)

Renato Oliveira

unread,
Apr 2, 2013, 3:35:07 PM4/2/13
to django...@googlegroups.com
Não sei se entendi direito:

Ex: MeuModel tem nome, idade e bairro

ai ele escolhe entre nome idade e bairro e bota o valor lá?



Renato Oliveira
Graduando em Ciência da Computação UFPE - 2009.1
LabCodes - www.labcodes.com.br
Linux User - #532503


2013/4/2 Fellipe Henrique <fell...@gmail.com>

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Django Brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para django-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Fellipe Henrique

unread,
Apr 2, 2013, 3:38:04 PM4/2/13
to django...@googlegroups.com
Na verdade, eu tenho um html, com vários input, cada input é sobre um campo, aí o usuário preenche o input que quer pesquisar, e clicaria em Busca... aí minha view, pegaria esses inputs, e o que tivesse valor, pesquisaria no Model, e retornaria numa lista.

[]s

T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

"Quemadmodum gladius neminem occidit, occidentis telum est." (Epistulae morales ad Lucilium, Lucius Annaeus Seneca)

"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." 
Albert Einstein (March 14th 1879 – April 18th 1955)


Renato Oliveira

unread,
Apr 2, 2013, 3:40:27 PM4/2/13
to django...@googlegroups.com
atributos = {}
pra cada field e valor você bota no dicionário
MeuModel.objects.filter(**atributos)

Renato Oliveira

unread,
Apr 2, 2013, 3:45:00 PM4/2/13
to django...@googlegroups.com
Não sei se com django forms tem um modo mais correto de se fazer isso

Renato Oliveira
Graduando em Ciência da Computação UFPE - 2009.1
LabCodes - www.labcodes.com.br
Linux User - #532503


2013/4/2 Renato Oliveira <renatooli...@gmail.com>

Fellipe Henrique

unread,
Apr 2, 2013, 3:46:41 PM4/2/13
to django...@googlegroups.com
Entendi, tem um exemplo disso numa view? tentei fazer aqui e nao consegui.

T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

"Quemadmodum gladius neminem occidit, occidentis telum est." (Epistulae morales ad Lucilium, Lucius Annaeus Seneca)

"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." 
Albert Einstein (March 14th 1879 – April 18th 1955)


Renato Oliveira

unread,
Apr 2, 2013, 3:52:37 PM4/2/13
to django...@googlegroups.com
Como você tentou? Posta o código no gist.github.com

Fellipe Henrique

unread,
Apr 2, 2013, 3:58:41 PM4/2/13
to django...@googlegroups.com
Está aqui.. mas tem algo muito errado.. pq eu não estou conseguindo passar tudo do html pra view..

def searchNota(request, vchave_nota=None, vdata_ini=None, vdata_fim=None):
    if vchave_nota:
        nota = notas.objects.get(chave_nota=vchave_nota)
    else:
        nota = None

    return render_to_response(
        'lista_nota.html',
        locals(),
        context_instance=RequestContext(request),
        )




T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

"Quemadmodum gladius neminem occidit, occidentis telum est." (Epistulae morales ad Lucilium, Lucius Annaeus Seneca)

"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." 
Albert Einstein (March 14th 1879 – April 18th 1955)


luan fonceca

unread,
Apr 2, 2013, 5:16:50 PM4/2/13
to django...@googlegroups.com
Fala cara, eu criaria um Form pra essa pesquisa e o submiit seria para uma view que faria as queries:

# Sua classe de Form que representa os campos a serem buscados
class PesquisaNotaForm(forms.ModelForm):
    fields = ['chave_nota', 'data_ini', 'data_fim'] # Todos os campos  do seu Model que você deseja exibir no formulario html
    class Meta:
        models = Nota # Seu Model


# Sua view que receberá a submissao do formulario
def searchNota(request):
    pesquisa_nota_form = PesquisaNotaForm(request.POST)
    if pesquisa_nota_form.is_valid():
        data = pesquisa_nota_form.cleaned_data()
        # Os arqgumentos filter() vão depender do que você deseja fazer com a sua query
        notas = Nota.objects.filter(
            models.Q(chave_nota=data['chave_nota']) |
            models.Q(data_ini=data['data_ini']) |
            models.Q(data_fim=data['data_fim']) |
        )
    return render_to_response(
        'lista_nota.html',
        locals(),
        context_instance=RequestContext(request),
        )

  • Software Engineering student at the Universidade Federal do Rio Grande do Norte;
  • Front-end Designer and Developer;
  • Python/Django Developer at the multmeio.com.br.

Felipe Prenholato

unread,
Apr 2, 2013, 5:49:31 PM4/2/13
to Django Users BR
Fellipe, forms como o Luan disse são o caminho. Eles vão te ajudar na exibição de validação dos dados da busca.

Vou te passar uma visão geral de como eu trabalho com filtros aqui, pode ser muita informação mas le com calma que vc digere.


Por vezes, filtros podem se tornar muito complexos, e ai é legal vc trabalhar um pouco mais isso.

Por exemplo, vc tem o campo chave_nota, pra este exemplo vou considerar que ele é um charfield e unique. Vou considerar também que a pessoa quando digitar o valor neste campo do form, quer uma busca exata, ou seja, não preciso filtrar por data.

No caso acima, havendo o campo chave_nota eu só preciso filtrar com um chave_nota__iexact=value.

Um outro ponto, é que com quaisquers tipos de campos, quando existem campos de data, eles se aplicam mais ou menos assim:

data_entre=(inicial, final) E (campo1=x ou campo2=x ou campo3=x)

Essas coisas de filtro sempre vão complicar um pouco e eu recomendo sempre quebrar o filtro em algumas partes: Validação do form > Validação de valores padrões vs valores enviados > Construção das Lookups > aplicação na query.

Em function based views, vc faria as validações usando os métodos clean do form e os valores iniciciais enviaos ao form. A construção dos lookups poderia se dar no save() do form e a aplicação na view, usando os valores do save.

Em class based views, eu costumo ter um filter_form. Este filter_form é processado por um método get_filters() que eu crio usando o cleaned_data do form e um dicionario de valores iniciais. O resultado do get_filters é então aplicado a queryset pelo apply_filters(). Fica algo como:

def get_queryset(self):
  return self.apply_filters(super(Klass, self).get_queryset())

def apply_filters(self, queryset):
  filters = self.get_filters()

  # aplica os fitlers ai qs, um a um

  return queryset




Felipe 'chronos' Prenholato.
Linux User nº 405489
Home page: http://devwithpassion.com | http://chronosbox.org/blog
GitHub: http://github.com/chronossc/ | Twitter: http://twitter.com/chronossc

Fellipe Henrique

unread,
Apr 3, 2013, 7:14:17 AM4/3/13
to django...@googlegroups.com
Valeu amigos, muito obrigado pelas explicações, com certeza irei seguir a dica dos Forms....

[]s

T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

"Quemadmodum gladius neminem occidit, occidentis telum est." (Epistulae morales ad Lucilium, Lucius Annaeus Seneca)

"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." 
Albert Einstein (March 14th 1879 – April 18th 1955)


Reply all
Reply to author
Forward
0 new messages