У меня есть модель User
и свойство username
с валидатор, который проверяет username
доступных символов, не пусто и существование в БД. Таким образом, я не нуждаюсь в каких-либо других проверках при обращении с регистрационной формой, например, я просто присвоил значение формы username
для свойства модели и ошибки проверки ловушки, если введено username
.запросов фильтрации по недвижимости с валидатора выставиться
Но это не работает.
Поскольку NDB также проверяет аргументы сравнения свойств (см. Метод Property._comparison в ndb/model.py), и он переходит к бесконечной рекурсии в Query.filter (User.username == [somevalue]) и, наконец, вызывает RuntimeError: maximum recursion depth exceeded
. NDB пытается проверить [SomeValue] с validate_username
и снова перейти на этот запрос ...
Можно присвоить имя пользователя ID субъекта и использовать User.get_by_id(), но это необходимо username
быть изменчива, поэтому я необходимо использовать Query.get()
.
Так это моя User
модель:
class User(ndb.Model):
def validate_username(self, value):
value = str(value).strip()
# Other useful checks - length, available symbols, etc
if User.get_user(value):
raise ValueError('Username already exists')
return value
@classmethod
def get_user(cls, username):
username = str(username)
user_q = User.query()
user_q = user_q.filter(User.username == username) # Here is the problem
return user_q.get()
username = ndb.StringProperty(validator=validate_username)
Например:
# Trying to add user, get RuntimeError exception
u = User()
u.username = 'John'
Что я делаю неправильно? Каков наилучший способ решения такой проблемы?
ОБНОВЛЕНИЕ ДО Tim Hoffman: Спасибо. Да, я пропустил аргумент prop, но метод получил prop
в self
и val
в val
аргументах - таким образом, я не упомянул об этой ошибке. Но вы пропустили ключевую проблему - вы не используете запрос с фильтром в validator (метод User.get_user). Попробуйте это, нет смысла функции или метод валидатора:
def validate_username2(prop, value):
if User.get_user(value):
raise Exception('User exists!')
return value
class User(ndb.Model):
def validate_username(self, value):
if User.get_user(value):
raise Exception('User exists!')
return value
@classmethod
def get_user(self, username):
user_q = User.query()
user_q = user_q.filter(User.username == username)
return user_q.get()
# Try both please
username = ndb.StringProperty(validator=validate_username)
#username = ndb.StringProperty(validator=validate_username2)
Документы говорят - будут вызываться с аргументами (prop, value) и должны либо вернуть (возможно принудительное) значение, либо вызвать исключение. Однако ваш метод validate_username определяется только значением. Попробуйте определить его как функцию, а не метод с args (свойство, значение). –