我正在尝试按照以下方式验证我的Django模型中的预期IP值:
def validate_dmvpn_ip(value,subnet):
from django.core.exceptions import ValidationError
if subnet not in value or value != '0.0.0.0':
raise ValidationError(u'Invalid IP address, please check corrent octects have been assigned')
在我的职能中我有
//crete subquery to count the size of child collection
Expression<Long> countExpression = ExpressionUtils.as(JPAExpressions
.select(ExpressionUtils.count(alarm))
.from(alarmSet.alarms, alarm)
.where(alarm.alStatus.eq(1)), "customCount");
我只需要将当前值传递给函数进行检查,但我不确定如何设置它?
由于
答案 0 :(得分:1)
当你执行validators=[validate_dmvpn_ip('','172.16.100.')]
时,你最终得到了将验证函数作为验证器调用的返回值(validators=[None]
,因为你没有返回任何东西)。看起来您正在尝试创建可自定义的验证功能。为此,您需要编写一个返回另一个函数的函数:
def validate_dmvpn_ip(subnet):
from django.core.exceptions import ValidationError
def validator(value):
if subnet not in value or value != '0.0.0.0':
raise ValidationError('Invalid IP address, please check corrent octects have been assigned')
return validator
你这样使用它:
# outside model:
main_validator = validate_dmvpn_ip('172.16.100.')
main_validator.__name__ = 'main_validator'
main_validator.__module__ = 'path.to.this.module'
# inside model
dmvpn_dsl = models.GenericIPAddressField(protocol='IPv4', verbose_name="DMVPN DSL IP", \
validators=[main_validator], blank=True, null=True)
外部函数返回另一个函数,它接受一个值来验证,但仍然可以访问要验证的子网。
注意我是如何将验证器签名到另一个变量并分配__name__
和__module__
属性的。虽然通常不需要这样做,但是django需要能够直接引用验证器以进行迁移,并且不会在任何地方分配返回的函数。当然,如果你只有一个这样的验证器,你可以对子网进行硬编码并避免这种混乱:
def validate_dmvpn_ip(value):
subnet = '172.16.100.'
from django.core.exceptions import ValidationError
if subnet not in value or value != '0.0.0.0':
raise ValidationError('Invalid IP address, please check corrent octects have been assigned')
和
dmvpn_dsl = models.GenericIPAddressField(protocol='IPv4', verbose_name="DMVPN DSL IP", \
validators=[validate_dmvpn_ip], blank=True, null=True)
要了解有关嵌套函数(闭包)的更多信息,请查看decorators in python,它们基本上是这种+特殊@
语法。