Excluir el campo 'extra' del conjunto de consultas
Frecuentes
Visto 916 veces
4
Tengo un QuerySet con un campo 'extra':
query_set = data_model.extra(select={'status': '''CASE <sql-query here>''')
Pero cuando trato de excluir o filtrar este campo:
query_set = query_set.exclude(status=1)
query_set = query_set.filter(status=2)
Me da un error:
Cannot resolve keyword 'status' into field. Choices are: <list of field from my models
here>
Entiendo que 'extra' significa usar SQL puro (sin ORM), pero el método 'excluir' o 'filtrar' son métodos 'ORM'. Pero en este caso, ¿por qué otros métodos, por ejemplo, 'values_list', funcionan bien?
values = query_set.values_list('status')
El código anterior no genera ninguna excepción. Entonces, ¿cómo puedo filtrar o excluir campos que se obtuvieron con el método 'extra'?
Este es un modelo bastante simple (pero con muchos campos), pero este es el método 'extra' que uso:
qs = qs.extra(select={
'void_status': '''CASE
WHEN "orderitem".voided_date IS NULL
THEN {normal}
WHEN "orderitem".voided_date >= %s AND
"orderitem".voided_date < %s AND
"orderitem".created_date >= %s AND
"orderitem".created_date < %s
THEN {fully_voided}
WHEN "orderitem".voided_date >= %s AND
"orderitem".voided_date < %s
THEN {voided}
ELSE {normal}
END'''.format(normal=1,
voided=2,
fully_voided=3)
}, select_params=[start, end] * 3)
0 Respuestas
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas django django-models or haz tu propia pregunta.
¿Puedes publicar tus modelos y el sql adicional, por favor? - Henrik Andersson
posible duplicado de Django ORM: filtrar por atributo adicional - tuxcanfly
¿Quiso decir que necesito usar algo como qs.extra(where=[...], params=[...])? Intenté esto y obtuve errores de base de datos (el campo no existe, pero parece que este es otro problema). ¡Gracias! - Andrey