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:
def selectByProperties(modelType, specify):
clause = "SELECT * from %s" % modelType._meta.db_table
if len(specify) > 0:
clause += " WHERE "
for field, eqvalue in specify.items():
clause += "%s = '%s' AND " % (field, eqvalue)
clause = clause [:-5] # remove last AND
print clause
return modelType.objects.raw(clause)
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
SELECT * from appname_modelname WHERE property1 = '77' AND property2 = '12'
y devuelve un QuerySet en esos elementos.
Esta es una función de prueba:
from myApp.models import myModel
def testSelectByProperties ():
specify = {"property1" : "77" , "property2" : "12"}
subset = selectByProperties(myModel, specify)
nameField = "property0"
## checking if that is what I expected:
for i in subset:
print i.__dict__[nameField],
for j in specify.keys():
print i.__dict__[j],
print
¿Y? ¿Qué piensas?