2016-04-03 2 views
0

Я мигрирующого моего старого кода из колбы SQLAlchemyTypeError: несвязанный метод make_valid_name() должен быть вызван с экземпляром пользователя в качестве первого аргумента (получил Юникод экземпляра вместо)

from flask.ext.sqlalchemy import SQLAlchemy 

к sqlalchemy.orm - сессия производитель

from sqlalchemy.orm import sessionmaker 

Модель

@staticmethod 
class User(Base): 
    __tablename__ = 'user' 
    id   = Column(Integer  , primary_key=True) 
    name  = Column(String(20)  , unique=True, nullable=False) 
. 
. 
. 
    def make_valid_name(name): 
     return re.sub('[^a-zA-Z0-9_\.]', '', name) 

Форма

def validate(self): 
. 
. 
.  
if self.name.data != User.make_valid_name(self.name.data): 
       self.name.errors.append('Please use letters, numbers, dots and underscores only.') 
       return False 

При принятии вызова метода self.validate() бросает следующие ошибки

TypeError: unbound method make_valid_name() must be called with User instance as first argument (got unicode instance instead) 

Я не уверен, что должно быть изменено, как я могу проверить «self.name.data "С полевых данных

Любая помощь по этому вопросу будет отличной.

+0

ли '@ staticmethod' отображаются в коде, который вы пропустили? – dirn

+0

Да, это статический метод. – Pradeep

ответ

0

только вариант должен был создать объект User снова и инициализировать атрибуты затем передать, что в качестве параметра вместо формы имени объекта непосредственно

user = User(
name = self.name.data 
) 

if self.name.data != User.make_valid_name(user): 

и в модели доступа к же по

user.name 

: @ должны переписать все.

Любое другое оптимальное решение также будет оценено. Если кто-то еще столкнется с подобной проблемой в будущем.

1

Эта ошибка означает, что User.make_valid_name - это метод экземпляра, а не статический метод, как вы ожидали. Решение, если вы хотите сохранить существующие использования, чтобы украсить метод с staticmethod, а не класс:

class User(Base): 
    ... 
    @staticmethod 
    def make_valid_name(name): 
     return ... 

В качестве альтернативы, вы можете сделать это classmethod вместо:

class User(Base): 
    ... 
    @classmethod 
    def make_valid_name(cls, name): 
     return ... 
Смежные вопросы

 Смежные вопросы