[英]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.