¿Es posible filtrar un conjunto de consultas de Django por propiedad del modelo?
tengo un método en mi modelo:
@property
def myproperty(self):
[..]
y ahora quiero filtrar por esta propiedad como:
MyModel.objects.filter(myproperty=[..])
¿Es esto de alguna manera posible?
Respuestas:
No Los filtros de Django operan a nivel de base de datos, generando SQL. Para filtrar según las propiedades de Python, debe cargar el objeto en Python para evaluar la propiedad, y en ese punto, ya ha hecho todo el trabajo para cargarlo.
fuente
Puede que esté malinterpretando su pregunta original, pero hay un filtro incorporado en Python.
Pero es mejor usar una lista de comprensión :
o mejor aún, una expresión generadora :
fuente
Partiendo de la solución alternativa sugerida por @ TheGrimmScientist, puede crear estas "propiedades sql" definiéndolas en el Administrador o en el QuerySet, y reutilizarlas / encadenarlas / componerlas:
Con un gerente:
Con un QuerySet:
Consulte https://docs.djangoproject.com/en/1.9/topics/db/managers/ para obtener más información. Tenga en cuenta que me estoy saliendo de la documentación y no he probado lo anterior.
fuente
Parece que usar F () con anotaciones será mi solución para esto.
No se filtrará
@property
, ya que seF
comunica con la base de datos antes de que los objetos se introduzcan en Python. Pero aún poniéndolo aquí como respuesta, ya que mi razón para querer filtrar por propiedad era realmente querer filtrar objetos por el resultado de aritmética simple en dos campos diferentes.entonces, algo parecido a:
en lugar de definir la propiedad como:
luego haciendo una lista de comprensión de todos los objetos.
fuente
Tuve el mismo problema y desarrollé esta solución simple:
Sé que no es la solución más eficaz, pero puede ayudar en casos simples como el mío.
fuente
POR FAVOR alguien me corrija, pero supongo que he encontrado una solución, al menos para mi propio caso.
Quiero trabajar en todos aquellos elementos cuyas propiedades sean exactamente iguales a ... lo que sea.
Pero tengo varios modelos y esta rutina debería funcionar para todos los modelos. Y lo hace:
Con esta subrutina universal, puedo seleccionar todos aquellos elementos que sean exactamente iguales a mi diccionario de combinaciones 'especificar' (nombre de propiedad, valor de propiedad).
El primer parámetro toma un (modelos.Modelo),
el segundo un diccionario como: {"propiedad1": "77", "propiedad2": "12"}
Y crea una declaración SQL como
y devuelve un QuerySet en esos elementos.
Esta es una función de prueba:
¿Y? ¿Qué piensas?
fuente
AttributeError: 'RawQuerySet' object has no attribute 'values'
Sé que es una pregunta antigua, pero por el bien de los que saltan aquí, creo que es útil leer la pregunta a continuación y la respuesta relativa:
Cómo personalizar el filtro de administración en Django 1.4
fuente
También puede ser posible utilizar anotaciones de QuerySet que duplican la propiedad get / set-lógica, como se sugiere por ejemplo por @rattray y @thegrimmscientist , en conjunción con el
property
. Esto podría producir algo que funciona tanto en el nivel de Python y en el nivel de base de datos.Sin embargo, no estoy seguro de los inconvenientes: consulte esta pregunta SO como ejemplo.
fuente