Уникальный валидатор (WTForms) для Google App Engine

Я пытаюсь сделать уникальный валидатор для WTForms, который работает с движком Google App. У меня есть модель под названием «Вопрос» и поле под названием «slug», которое мне нужно, чтобы оно было уникальным. Я нашел этот действительно хороший пример в Stackoverflow, но он использует SQLAlchemy. Я хотел посмотреть, может ли кто-нибудь помочь мне понять, как заставить его работать с Google App Engine вместо SQLAlchemy.

Пример SQLAlchemy: Уникальный валидатор в WTForms с моделями SQLAlchemy

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 нужно поменять строчку "check"? Но я не лучший специалист в передаче подобных вещей объектам.

Я знаю, что запрос GAE будет чем-то вроде ... Question.query (Question.slug = slug)


person TylerW    schedule 30.10.2013    source источник
comment
Просто используйте значение заголовка в качестве имени в ключе. Это будет быстрее, чем запрос может гарантировать, что он не соответствует транзакциям.   -  person Tim Hoffman    schedule 31.10.2013
comment
Вам это помогает? stackoverflow .com / questions / 16441804 /. Обратите внимание на функцию Unique в вопросе.   -  person rajpy    schedule 31.10.2013
comment
возможный дубликат Уникальный валидатор в WTForms с моделями SQLAlchemy   -  person nsfyn55    schedule 01.06.2014
comment
возможный дубликат Как определить уникальное свойство для модели в Google App Engine?   -  person David Pope    schedule 01.06.2014


Ответы (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`
person TylerW    schedule 02.11.2013