我有10个模型类,我想检查传递的数据是否在表中可用。我有一个计划,我可以创建一个函数,它将接受模型类名称的参数,检查属性以及该字段的值。 来自数据导入模型
def IsAvailable(model, attr, val):
# Here I wanted to create object of given model class and validate whether the attr has the give value.
obj = getattr(models, model)
res = obj.objects.get(attr=val)
return res
这不起作用,因为attr
不是给定模型中的字段。有人可以帮助我吗?
答案 0 :(得分:3)
您可能需要**
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< 1.7中使用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()