Будь ласка, хтось виправте мене, але, мабуть, я знайшов рішення, принаймні для власного випадку.
Я хочу працювати над усіма тими елементами, властивості яких точно дорівнюють ... як завгодно.
Але у мене є кілька моделей, і ця процедура повинна працювати для всіх моделей. І це робить:
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)
За допомогою цієї універсальної підпрограми я можу вибрати всі ті елементи, які точно відповідають моєму словнику комбінацій «задати» (ім’я властивості, значення властивості).
Перший параметр приймає (models.Model),
другий словник, як: {"property1": "77", "property2": "12"}
І він створює такий оператор SQL, як
SELECT * from appname_modelname WHERE property1 = '77' AND property2 = '12'
і повертає QuerySet для цих елементів.
Це тестова функція:
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
І? Що ти думаєш?