Helio13 Posted October 8, 2013 at 02:51 PM Report #528072 Posted October 8, 2013 at 02:51 PM (edited) 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 October 8, 2013 at 02:52 PM by Helio13
Dr_Lion Posted October 9, 2013 at 02:14 PM Report #528185 Posted October 9, 2013 at 02:14 PM 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.
Pedro C. Posted October 9, 2013 at 03:05 PM Report #528190 Posted October 9, 2013 at 03:05 PM 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.
motherFFH Posted October 12, 2013 at 07:31 AM Report #528640 Posted October 12, 2013 at 07:31 AM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now