Consultas com vários parâmetros

112 views
Skip to first unread message

Marcos Souza

unread,
Aug 22, 2019, 9:28:10 AM8/22/19
to Django Brasil
Olá!
Como vocês fazem consultas em django com vários parâmetros?
Penso também na otimização da consulta. Em como deve ser....
Abaixo um exemplo de como estou fazendo. Mas não sei se é a forma mais correta.
Aguardo ajuda! Valeu!

object_list = Cliente.objects.all()
if params['nome']:
  object_list = object_list.filter(nome__icontains = params['nome'])
if params['nome_mae']:
  object_list = object_list.filter(nome_mae__icontains = params['nome_mae'])
if params['dt_nasc']:
  object_list = object_list.filter(dt_nasc = params['dt_nasc'])
if params['ativo']:
  object_list = object_list.filter(is_active = True)
if params['situacao'] == 'CAD_HOJE':
 object_list = object_list.filter(dt_cadastro__gte=date.today())

fernandes macedo

unread,
Aug 22, 2019, 9:32:39 AM8/22/19
to django...@googlegroups.com
veja se te ajuda.
 
Atenciosamente,

"

Aprenda como se você fosse viver para sempre. Viva como se você fosse morrer amanhã.

Santo Isidoro de Sevilha
"
Fernandes Macedo
about.me/macedo


--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/django-brasil/7228d77e-27d0-4583-9cd0-d7b4074d90b0%40googlegroups.com.

Vinicius Mendes

unread,
Aug 22, 2019, 9:39:35 AM8/22/19
to Django Brasil
Bom dia,

Você pode fazer com programação funcional também:

...
filtered_params = dict([(key, value) for key, value in params if value != None])
object_list = object_list.filter(**filtered_params)
...

Nos casos em que o nome do lookup é diferente do nome do atributo do dicionário params, você pode fazer um mapeamento:

...
param_to_lookup = {'nome': 'nome__icontains', 'nome_mae': 'nome_mae__icontains', 'ativo': 'is_active'}
filtered_params = dict([(param_to_lookup.get(key, key), value) for key, value in params if value != None])
object_list = object_list.filter(**filtered_params)
...

E para o caso da situação que tem que usar tanto nome do parâmetro quanto valor diferentes adiciona a condição manualmente:

...
param_to_lookup = {'nome': 'nome__icontains', 'nome_mae': 'nome_mae__icontains', 'ativo': 'is_active'}
filtered_params = dict([(param_to_lookup.get(key, key), value) for key, value in params if value != None])
if (filtered_params['situacao'] == 'CAD_HOJE'):
    filtered_params['dt_cadastro__gte'] = date.today()
object_list = object_list.filter(**filtered_params)
...

Atenciosamente,
Vinicius Mendes
Analista de Sistemas


On Thu, Aug 22, 2019 at 10:28 AM Marcos Souza <marcos.so...@gmail.com> wrote:
--

Sinval Júnior

unread,
Aug 25, 2019, 5:21:11 PM8/25/19
to django...@googlegroups.com
O Django Filter [1] é um é um projeto bem util. para consultas acumulativas.




Ao encaminhar esta mensagem, por favor:
1 - Apague meu endereço eletrônico;
2 - Encaminhe como Cópia Oculta (Cco ou BCc) aos seus destinatários. Dificulte assim a disseminação de vírus, spams e banners.

#=================================================================+
#!/usr/bin/env python
nome = 'Sinval Júnior'
email = 'sinvalju arroba gmail ponto com'
print nome
print email
#==================================================================+


--

Paulo Fabrício

unread,
Aug 29, 2019, 4:09:27 PM8/29/19
to django...@googlegroups.com
Eu faço assim:

args = dict()

if params['nome']:
args.update({"nome__icontains":params['nome']})

if params['nome_mae']:
args.update({"nome_mae__icontains": params['nome_mae']})
if params['dt_nasc']:
args.update({"dt_nasc": params['dt_nasc']})

if params['ativo']:
args.update({"is_active": True})

if params['situacao'] == 'CAD_HOJE':
args.update({"dt_cadastro__gte": date.today()})

object_list = Cliente.objects.filter(**args)

Att,
Paulo Fabrício
BORA BAHÊA MINHA P*!

-------- Mensagem original --------
De: Marcos Souza <marcos.so...@gmail.com>
Para: Django Brasil <django...@googlegroups.com>
Assunto: Consultas com vários parâmetros
Data: Thu, 22 Aug 2019 06:28:10 -0700 (PDT)
--
Reply all
Reply to author
Forward
0 new messages