你可能想要** keyword pass-through:
def IsAvailable(model, attr, val):
obj = getattr(models, model)
res = obj.objects.get(**{attr: val})
return res
这会将字典{attr: val} 作为关键字参数传递给get(),即{'foo': 'bar'} 调用get(foo='bar'}。
使这个通用的奖励积分:
def IsAvailable(model, **kwargs):
obj = getattr(models, model)
res = obj.objects.get(**kwargs)
return res
这让您可以调用IsAvailable(model, attr1=val1, attr2=val2),测试所有属性的可用性,这可能更方便。
在 Django 1.7 中,您还可以跨应用程序为整个项目按名称解析模型(在 django a different method)。
from django.apps import apps
def get_model_dotted(dotted_model_name):
app_label, model_name = dotted_model_name.split(".", 1)
return apps.get_model(app_label, model_name)
def IsAvailable(model, **kwargs):
model = get_model_dotted(model_name)
res = model.objects.get(**kwargs)
return res;
用作IsAvailable('app1.model1', attr1=value1)。
请记住,当多个对象与过滤器匹配时,get() 会引发 MultipleObjectsReturned,因此您可能确实需要
res = model.objects.filter(**kwargs)
甚至只是
return model.objects.filter(**kwargs).exists()