mongoengine中StringField的choices的值校验

1 篇文章 0 订阅
1 篇文章 0 订阅

在mongoengine中使用StringField的choice功能时,希望能得到一个对用户更友好的错误提示,因此就要求能在写入数据库之前先进行一次验证已完成自定义提示。

多方查找后发现在BaseField中就包含了验证方法,代码如下:

        if self.choices:
            is_cls = isinstance(value, (Document, EmbeddedDocument))
            value_to_check = value.__class__ if is_cls else value
            err_msg = 'an instance' if is_cls else 'one'
            if isinstance(self.choices[0], (list, tuple)):
                option_keys = [k for k, v in self.choices]
                if value_to_check not in option_keys:
                    msg = ('Value must be %s of %s' %
                           (err_msg, str(option_keys)))
                    self.error(msg)
            elif value_to_check not in self.choices:
                msg = ('Value must be %s of %s' %
                       (err_msg, str(self.choices)))
                self.error(msg)
因为需要在Document外使用,所以对代码进行了包装,包装后代码如下:

def validate(value, choices):
    if choices:
        if isinstance(choices[0], (list, tuple)):
            option_keys = [k for k, v in choices]
            return value in option_keys
        else:
            return value in choices
    else:
        return False

如此即可方便的对数据进行验证。

举例如下:

class UserProfile(Document):
    SEX_TYPE = (
        ('secret', '保密'),
        ('male', '男'),
        ('female', '女'),
    )
    sex = StringField(max_length=30, default='secret', choices=SEX_TYPE)  # 性别
	
profile = UserProfile(sex='male').save()
print(profile.sex)
# male
profile.sex = 'error'
# raise ValidationError
print(validate('error',UserProfile.SEX_TYPE))
# False






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值