1

我正在尝试为与 Google App 引擎一起使用的 WTForms 制作一个独特的验证器。我有一个名为 Question 的模型和一个名为“slug”的字段,我需要它是独一无二的。我在 Stackoverflow 上发现了这个非常好的示例,但它使用了 SQLAlchemy。我想看看是否有人可以帮助我弄清楚如何让它与 Google App Engine 而不是 SQLAlchemy 一起工作。

SQLAlchemy 示例:具有 SQLAlchemy 模型的 WTForms 中的唯一验证器

class Unique(object):
    """ validator that checks field uniqueness """
    def __init__(self, model, field, message=None):
        self.model = model
        self.field = field
        if not message:
            message = u'this element already exists'
        self.message = message

    def __call__(self, form, field):         
        check = self.model.query.filter(self.field == field.data).first()
        if check:
            raise ValidationError(self.message)

我认为需要更改“检查”行才能与 GAE 一起使用?但我不是最擅长将这样的东西传递给对象的人。

我知道 GAE 查询类似于... Question.query(Question.slug = slug)

4

1 回答 1

1

我能够做到这一点......

class UniqueValidator(object):
""" validator that checks field uniqueness """
def __init__(self, model, field, message=None):
    self.model = model
    self.field = field
    if not message:
        message = u'Existing element with the same value.'
    self.message = message

def __call__(self, form, field):
    existing = self.model.query(getattr(self.model,self.field) == field.data).get()
    if 'id' in form:
        id = int(form.id.data)
    else:
        id = None
    if existing and (id is None or id != existing.key.id()):
        raise ValidationError(self.message)

class QuestionEditForm(Form):
id = HiddenField('id')
question = TextField('Question', [validators.Required(),
                                  validators.Length(min=4, max=225)])
slug = TextField('Slug', validators = [validators.Required(),
                                       validators.length(max=200),
                                       UniqueValidator(
                                           Question,
                                           'slug',
                                           'Existing slug with the same value.'
                                       )])`enter code here`
于 2013-11-02T20:18:39.393 回答