将参数传递给成为函数关键字的类

时间:2016-08-07 19:06:58

标签: python sqlalchemy flask-sqlalchemy wtforms flask-wtforms

在Flask和SQLAlchemy中使用WTForms。从用户名和电子邮件字段中获取数据并确保它们尚未存在于数据库中。这就是我现在必须做的事情。

class IsUnique(object):
    def __init__(self, db_field=None):
        self.db_field = db_field

    def __call__(self, form, field):
        data = field.data
        if self.db_field=='name':
            if User.query.filter_by(name=data).first() != None:
                raise ValidationError('Sorry, that username is taken.')
        if self.db_field=='email':
            if User.query.filter_by(email=data).first() != None:
                raise ValidationError(
                    'Sorry, that email address has already been registered.'
                    )

我想要做的是将db_field参数作为字符串传递给类实例,并将其传递给User.query.filter_by(db_field=data。不幸的是,我所知道的是如何使用if语句,它有效,但有点麻烦。必须有一种方法可以做到这一点,但我不知道如何做。

1 个答案:

答案 0 :(得分:2)

您可以传递keyword arguments as a dict,如下所示:

def __call__(self, form, field):
    key = self.db_field # 'name' or 'email'
    params = { key: field.data }
    if User.query.filter_by(**params).first() != None:
        raise ValidationError('Sorry, that {} is taken.'.format(key))