【问题标题】:How to dynamically validate data in django models如何动态验证 django 模型中的数据
【发布时间】:2015-11-20 07:43:10
【问题描述】:

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

【问题讨论】:

    标签: python django


    【解决方案1】:

    你可能想要** 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()
    

    【讨论】:

      猜你喜欢
      • 2021-08-22
      • 2016-05-21
      • 2019-12-24
      • 2010-12-27
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      相关资源
      最近更新 更多