Django模型验证,将当前值传递给函数?

时间:2017-04-18 10:43:52

标签: python django

我正在尝试按照以下方式验证我的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");

我只需要将当前值传递给函数进行检查,但我不确定如何设置它?

由于

1 个答案:

答案 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,它们基本上是这种+特殊@语法。