Jump to content
Sign in to follow this  
Helio13

Query recebendo parametros por post

Recommended Posts

Helio13

Oi.

Estou aqui com um problema, que é o seguinte:

Eu estou a receber parametros via post para fazer querys consoante os paramtros que me são passados...fazendo género de filtros.

Então estou a fazer assim

def filter(request):
if request.method == 'POST':
	namepost = request.POST.get('name')
	surnamepost = request.POST.get('surname')
	if namepost != None and surnamepost != None:
		result = [a.get_json() for a in Player.objects.filter((Q(name=namepost) & Q(surname=surnamepost)))]
       elif namepost != None and surnamepost == None:
		result = [a.get_json() for a in Player.objects.filter(name=namepost)]

	data = {"meta": {"total_count":len(result)}, "objects": result}
	aa = json.dumps(data)
	return HttpResponse(aa, content_type='application/json')

Está a funcionar correctamente, o problema é:

Se fosse apenas com estes 2 parametros, não havia problema, era completar o resto das hipoteses...o problema é que posso ter até 10 parametros passados por post para fazer os filtros, e nunca sei quais me são passados, podem ser 1, 2, 4...conforme o utilizador fizer o filtro...

Mas fazendo desta maneira ia ter um monte de ifs, pois ia ter muitas probabilidades...

há alguma maneira de eu poder fazer isto de outra forma?

Alguém me consegue ajudar?

Edited by Helio13

Share this post


Link to post
Share on other sites
Dr_Lion

Não estou familiarizado com o tipo de métodos mas, dá-me ideia que o que tens que alterar é a abordagem, ou seja a forma como estás a estruturar o problema.

Com ifs encadeados apenas é exequível para 2 ou 3 parâmetros mais que isso começa a ficar deveras complicado e pouco prático.

Agora uma questão, como é que são passados os parâmetros, a questão é porque se tiveres para cada um, uma identificação consegues saber a que parâmetro se refere, e deixas a necessidade de ter os ifs encadeados, além disso permite-te também usar um ciclo while em vez de ifs.

Basta veres se consegues contar o número de parâmetros que são passados na entrada.

result = [a.get_json() for a in Player.objects.filter((Q(name=namepost) & Q(surname=surnamepost)))]

Por exemplo, se tiveres 4 parametros fica algo "deste género"??

result = [a.get_json() for a in Player.objects.filter((Q(name=namepost) & Q(surname=surnamepost) & Q(name=namepost) & Q(surname=surnamepost)))]

em caso afirmativo podes usar o while tal como eu tinha dito para construires essa querie com todos os campos (uma string em que vais juntando os vários parametros), e depois no final, fora do ciclo executas a querie.

Share this post


Link to post
Share on other sites
Pedro C.

Concordo.

A pergunta é se sabes à partida (independente dos parâmetros que entram) se sabes o nome todos possíveis. Tendo uma lista com eles:

lista = ['a','b','c','d','e','f']
for i in params:  # Por cada parametro na lista de parametros "params"
 if i in lista:	 # Se esse parametro estiver na tua lista de parametros possíveis.
	  # Executar o código do parâmetro.

Agora reparei que é possível pelo teu código que cada um dos parâmetros tenha formulações possíveis pelo que terias de encadear ciclos com as hipóteses possíveis.

Share this post


Link to post
Share on other sites
motherFFH

Algo do género, não testado:

Qs = []
params = "namepost surnamepost foo bar".split()
for p in params:
v = request.POST.get(p)
if v is not None:
	Qs.append( Q(**{ p : v}) )
result = [a.get_json() for a in Player.objects.filter(*Qs)]

... e parece-me que os objectos Q's até eram dispensáveis.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.