Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Django error in objects.filter: too many values to unpack

Estas en el tema de Django error in objects.filter: too many values to unpack en el foro de Python en Foros del Web. Hola, Llevo muy poco con esto de Django y tengo una duda con este código. Código: filtro="marca:samsung|samsung2" aux=filtro.split(':') mismarcas=aux[1].split('|') mimarca='0' for marca in mismarcas: if ...
  #1 (permalink)  
Antiguo 28/11/2013, 12:43
 
Fecha de Ingreso: marzo-2007
Mensajes: 31
Antigüedad: 10 años, 8 meses
Puntos: 0
Pregunta Django error in objects.filter: too many values to unpack

Hola,

Llevo muy poco con esto de Django y tengo una duda con este código.

Código:
filtro="marca:samsung|samsung2"
aux=filtro.split(':')
mismarcas=aux[1].split('|')
mimarca='0'
for marca in mismarcas:
	if mimarca == '0':
		mimarca = ''
	else:
		mimarca += ' | '
	mimarca += "Q(" + aux[0] + "='" + marca + "')"
En este código la variable 'mimarca' acaba siendo:
Código:
Q(marca='samsung') | Q(marca='samsung2') 
Quiero usar esa cadena en una línea así:
Código:
productos= Producto.objects.filter(mimarca)
Pero me da el error: too many values to unpack

Si lo pongo a mano funciona:
Código:
productos= Producto.objects.filter(Q(marca='samsung') | Q(marca='samsung2'))
¿Puedo usar un string para realizar el filter del objeto?

Gracias!
Javi.
__________________
Tatuajes
  #2 (permalink)  
Antiguo 28/11/2013, 13:38
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 12 años, 8 meses
Puntos: 1360
Respuesta: Django error in objects.filter: too many values to unpack

Código Python:
Ver original
  1. def por_marcas(marca_list):
  2.     return reduce(lambda x, y: Q(marca=x)|Q(marca=y), marca_list)
  3.  
  4. marcas = ["samsung", "samsung2"]
  5. productos = Producto.objects.filter(por_marcas(marcas))
No, no puedes hacerlo así como así (me refiero usando un solo string)

Así debería de funcionar. Podrías modificar la función para que filtre por atributos arbitrarios y hacer algo cuando le manden un solo elemento.

O si lo prefieres.
Código Python:
Ver original
  1. from operator import __or__ as OR
  2. # ...
  3. marcas = [Q(marca="samsung"), Q(marca="samsung2")]
  4. productos = Producto.objects.filter(reduce(marcas, OR))
  #3 (permalink)  
Antiguo 29/11/2013, 03:24
 
Fecha de Ingreso: marzo-2007
Mensajes: 31
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Django error in objects.filter: too many values to unpack

Hola Razpeitia,

Gracias por la respuesta. Intentando entender el código que me has mandado he encontrado esto: http://www.michelepasin.org/blog/2010/07/20/the-power-of-djangos-q-objects/

Lo pongo por si le sirve a alguien...

Entiendo el asunto pero me surge otro problema y es que el atributo "marca" y las marcas en sí mismas, las tengo en variables.

Mi idea, para explicar lo que estoy intentando hacer, es crear una estructura de URL que realice las consultas a la base de datos de forma automática independientemente del número de parámetros y el contenido de estos...

Entonces, si pongo algo como:
Código:
from operator import __or__ as OR
# ...
marcas = [Q(aux[0]=aux[1]), Q(aux[2]=aux[3])]
productos = Producto.objects.filter(reduce(marcas, OR))
Me aparece el error: SyntaxError: keyword can't be an expression

Estoy intentando averiguar cómo solucionarlo...

Salu2 y gracias!
Javi.
__________________
Tatuajes
  #4 (permalink)  
Antiguo 29/11/2013, 04:30
 
Fecha de Ingreso: marzo-2007
Mensajes: 31
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Django error in objects.filter: too many values to unpack

Bueno, algo avanzo...

Acabo de probarlo y, si pongo este código funciona...

Código Python:
Ver original
  1. filtro="marca:samsung|nokia"
  2. aux=filtro.split(':')
  3. mismarcas=aux[1].split('|')
  4. productos= Producto.objects.filter(reduce(operator.or_, (Q(marca=x) for x in mismarcas)))

Pero si pongo este, cambiando el campo 'marca' por una variable, estamos en las mismas:
Código Python:
Ver original
  1. filtro="marca:samsung|nokia"
  2. aux=filtro.split(':')
  3. mismarcas=aux[1].split('|')
  4. productos= Producto.objects.filter(reduce(operator.or_, (Q(aux[0]=x) for x in mismarcas)))

Necesito que me acepte aux[0]... Poquito a poco...

Salu2.
Javi.
__________________
Tatuajes
  #5 (permalink)  
Antiguo 29/11/2013, 05:29
 
Fecha de Ingreso: marzo-2007
Mensajes: 31
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Django error in objects.filter: too many values to unpack

¡Conseguido!

Pongo el código por si le sirve a alguien...

Código Python:
Ver original
  1. filtro="marca:1|2"
  2. aux=filtro.split(':')
  3. mismarcas=aux[1].split('|')
  4. mimarca=[]
  5. for marca in mismarcas:
  6.         mimarca += [Q(**{ aux[0]: marca})]
  7.    
  8. productos = Producto.objects.filter(reduce(operator.or_, mimarca))

Gracias Razpeitia! Me has abierto los ojos!
Javi.
__________________
Tatuajes

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 19:00.