Foros del Web » Programando para Internet » Python »

Duda queryset (que busque igual por mas que el valor de un filtro sea nulo)

Estas en el tema de Duda queryset (que busque igual por mas que el valor de un filtro sea nulo) en el foro de Python en Foros del Web. Buenas !!! Si tengo una query, por ej: Código: contenido = Algo.objects.filter(categoria=objeto) Como hago para que busque por mas que "objeto" sea None ... , ...
  #1 (permalink)  
Antiguo 09/02/2014, 15:34
 
Fecha de Ingreso: marzo-2007
Mensajes: 340
Antigüedad: 17 años, 1 mes
Puntos: 4
Duda queryset (que busque igual por mas que el valor de un filtro sea nulo)

Buenas !!!

Si tengo una query, por ej:

Código:
contenido = Algo.objects.filter(categoria=objeto)
Como hago para que busque por mas que "objeto" sea None ... , es decir, si objeto es nulo que traiga todo sin usar ese filtro.

Pregunto porque tengo demasiados filtros dentro de un queryset y quiero saber si existe alguna forma de hacerlo sin tener que recurrir a un if o un switch para armar la queryset segun la ncesidad.

Gracias !
  #2 (permalink)  
Antiguo 09/02/2014, 17:23
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Duda queryset (que busque igual por mas que el valor de un filtro sea nulo

Código Python:
Ver original
  1. contenido = Algo.objects.all()
  2. if objeto is not None:
  3.     contenido = contenido.filter(categoria=objeto)

¿Algo así?
  #3 (permalink)  
Antiguo 09/02/2014, 18:27
 
Fecha de Ingreso: marzo-2007
Mensajes: 340
Antigüedad: 17 años, 1 mes
Puntos: 4
Respuesta: Duda queryset (que busque igual por mas que el valor de un filtro sea nulo

Lo que quiero es evitar justamente eso (el if), que si el valor sea nulo no aplique ese filtro (categoria=objeto)

Que quede en la sintaxis, pero si es None, que no lo use.

Porque si tengo muchos parametros son muchas lineas de codigo haciendo condicionales.
  #4 (permalink)  
Antiguo 09/02/2014, 19:20
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Duda queryset (que busque igual por mas que el valor de un filtro sea nulo

Bueno haces lo mismo para múltiples parámetros, solamente que por el amor a la vida no hardcodes cada parámetro.

Suponiendo que params es un diccionario de parametros. Ejemplo
Código Python:
Ver original
  1. # params = {'categoria': None, 'precio': 100, 'Fecha': None}
  2. params = dict((k, v) for k, v in params.items() if v is not None)
  3. contenido = Algo.objects.filter(**params)

O si usas python 2.7+
Código Python:
Ver original
  1. # params = {'categoria': None, 'precio': 100, 'Fecha': None}
  2. params = {k: v for k, v in params.items() if v is not None}
  3. contenido = Algo.objects.filter(**params)
  #5 (permalink)  
Antiguo 09/02/2014, 20:36
 
Fecha de Ingreso: marzo-2007
Mensajes: 340
Antigüedad: 17 años, 1 mes
Puntos: 4
Respuesta: Duda queryset (que busque igual por mas que el valor de un filtro sea nulo

Buenisimo !!! Eso es justamente lo que buscaba para no tener que hardcodear :P

Por lo visto se banca cualquier asignacion, ej: 'categoria_id__in' : categorias_buscar_list

Gracias !
  #6 (permalink)  
Antiguo 24/03/2014, 10:43
 
Fecha de Ingreso: marzo-2007
Mensajes: 340
Antigüedad: 17 años, 1 mes
Puntos: 4
Respuesta: Duda queryset (que busque igual por mas que el valor de un filtro sea nulo

Cita:
Iniciado por razpeitia Ver Mensaje
Bueno haces lo mismo para múltiples parámetros, solamente que por el amor a la vida no hardcodes cada parámetro.

Suponiendo que params es un diccionario de parametros. Ejemplo
Código Python:
Ver original
  1. # params = {'categoria': None, 'precio': 100, 'Fecha': None}
  2. params = dict((k, v) for k, v in params.items() if v is not None)
  3. contenido = Algo.objects.filter(**params)

O si usas python 2.7+
Código Python:
Ver original
  1. # params = {'categoria': None, 'precio': 100, 'Fecha': None}
  2. params = {k: v for k, v in params.items() if v is not None}
  3. contenido = Algo.objects.filter(**params)
Razpeita es posible utilizar Q en esto ???? es decir, dentro del diccionario para dos expresiones por ej ? gracias !

https://docs.djangoproject.com/en/de...with-q-objects
  #7 (permalink)  
Antiguo 24/03/2014, 10:50
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 1 mes
Puntos: 1329
Respuesta: Duda queryset (que busque igual por mas que el valor de un filtro sea nulo

Si, es posible.
__________________
Grupo Telegram Docker en Español
  #8 (permalink)  
Antiguo 24/03/2014, 12:01
 
Fecha de Ingreso: marzo-2007
Mensajes: 340
Antigüedad: 17 años, 1 mes
Puntos: 4
Respuesta: Duda queryset (que busque igual por mas que el valor de un filtro sea nulo

y como seria la sintaxis ???

si quisiera un OR para estos dos params por ej:

'contenido__icontains': request.GET['buscar'], 'titulo__icontains' : request.GET['buscar']

Como coloco las Q con esos paremtros ???
  #9 (permalink)  
Antiguo 24/03/2014, 12:06
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 1 mes
Puntos: 1329
Respuesta: Duda queryset (que busque igual por mas que el valor de un filtro sea nulo

Código Python:
Ver original
  1. Q('contenido__icontains': request.GET['buscar'] | 'titulo__icontains' : request.GET['buscar'])

Saludos
__________________
Grupo Telegram Docker en Español
  #10 (permalink)  
Antiguo 24/03/2014, 12:12
 
Fecha de Ingreso: marzo-2007
Mensajes: 340
Antigüedad: 17 años, 1 mes
Puntos: 4
Respuesta: Duda queryset (que busque igual por mas que el valor de un filtro sea nulo

Si tuviera que hacer esto ??? no le encuentro la vuelta a la sintaxis :(

Cita:
params = {'provincia': provincia, 'ciudad': ciudad, 'categoria_id__in' : categorias_buscar_list, Q('contenido__icontains': request.GET['buscar'] | 'titulo__icontains' : request.GET['buscar']) }

  #11 (permalink)  
Antiguo 24/03/2014, 12:31
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 1 mes
Puntos: 1329
Respuesta: Duda queryset (que busque igual por mas que el valor de un filtro sea nulo

Automáticamente no hay forma, ¿como le vas a decir que parametro es el que lo vas a meter en objetos Q? Y además eso que mostraste no es un diccionario válido.


Saludos
__________________
Grupo Telegram Docker en Español
  #12 (permalink)  
Antiguo 24/03/2014, 17:53
 
Fecha de Ingreso: marzo-2007
Mensajes: 340
Antigüedad: 17 años, 1 mes
Puntos: 4
Respuesta: Duda queryset (que busque igual por mas que el valor de un filtro sea nulo

Tiene q haber alguna forma de automatizar el codigo de razpeitia.

Se q el diccionario es invalido, la sintaxis es erronea.

Quizas algo con esta onda:

contenido = Algo.objects.filter(**params + Q('contenido__icontains': request.GET['buscar'] | 'titulo__icontains' : request.GET['buscar']))

?????
  #13 (permalink)  
Antiguo 24/03/2014, 17:59
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 1 mes
Puntos: 1329
Respuesta: Duda queryset (que busque igual por mas que el valor de un filtro sea nulo

No, esa sintaxis tampoco es válida. Piensa que esto es puro python.

Forma sencilla:

Código Python:
Ver original
  1. contenido = Algo.objects.filter(**params).filter(Q(contenido__icontains=request.GET['buscar']) | Q(titulo__icontains= request.GET['buscar']))

Saludos
__________________
Grupo Telegram Docker en Español
  #14 (permalink)  
Antiguo 24/03/2014, 19:59
 
Fecha de Ingreso: marzo-2007
Mensajes: 340
Antigüedad: 17 años, 1 mes
Puntos: 4
Respuesta: Duda queryset (que busque igual por mas que el valor de un filtro sea nulo

Graciassssssss !

Etiquetas: django
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:09.