如何动态验证django模型中的数据

时间:2015-08-26 10:09:38

标签: python django

我有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不是给定模型中的字段。有人可以帮助我吗?

1 个答案:

答案 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()