POR FAVOR, alguém me corrija, mas acho que encontrei uma solução, pelo menos para o meu caso.
Eu quero trabalhar em todos aqueles elementos cujas propriedades são exatamente iguais a ... qualquer coisa.
Mas eu tenho vários modelos, e essa rotina deve funcionar para todos os modelos. E faz:
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)
Com esta sub-rotina universal, posso selecionar todos os elementos que são exatamente iguais ao meu dicionário de combinações de 'especificar' (nome da propriedade, valor da propriedade).
O primeiro parâmetro leva um (models.Model),
o segundo, um dicionário como: {"propriedade1": "77", "propriedade2": "12"}
E cria uma instrução SQL como
SELECT * from appname_modelname WHERE property1 = '77' AND property2 = '12'
e retorna um QuerySet sobre esses elementos.
Esta é uma função de teste:
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
E? O que você acha?