簡體   English   中英

如何在Django模型中動態驗證數據

[英]How to dynamically validate data in django models

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

您可能想要**關鍵字傳遞

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中也可以,但可以使用其他方法 )。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM