2015-10-10 2 views
0

У меня есть следующая Колба-SQLAlchemy модель в декларативной базеЧто делает модель SQLAlchemy не сериализуемой?

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 
    pw = db.Column(db.String(20), unique=False) 
    last_login = db.Column(db.DATETIME) 

    posts = db.relationship('Post', backref='User') 

    def __init__(self, i, u, p): 
     self.id = i 
     self.username = u 
     self.pw = p 

    def __repr__(self) -> str: 
     return '<User %s, id = %d>' % (self.username, self.id) 


class Post(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(100)) 
    rest_text = db.Column(db.Text) 
    date = db.Column(db.DateTime) 
    author_id = db.Column(db.Integer, db.ForeignKey('user.id')) 

    def __init__(self, title: str, rest: str, author: User): 
     self.author = author 
     self.title = title 
     self.rest_text = rest 
     self.date = datetime.now() 
     self.id = randint(0, MAX_POSTS_NUM) 
     while self.id in db.session.query(Post.id).all(): 
      self.id = randint(0, MAX_POSTS_NUM) 

где db является экземпляром SQLAlchemy(app) объекта импортирован из __init__ файла моего Колба applicaiton. У меня есть уже существующая база данных sqlite3 с одним пользователем, с именем «тестом», и когда я делаю запрос в термосе с помощью

u = User.query.filter_by(username='test').first() 
u.username 

Я получаю следующую ошибку

TypeError: <User test, id = 1> is not JSON serializable 

на вопрос си почему это не JSON serializable. Что делает класс/модель JSON serializable?

+0

, используя комментарий, потому что им не удалось отладить его в данный момент, но в целом это исключение означает, что для модуля json было предложено сериализовать объект, отличный от строки, int или других базовых типов json datatypes. Кодировщику json нужно передать функцию обработчика, чтобы он знал, как представлять объект как один из них. Вот хороший пример того, как писать обработчик, но я не уверен, где json получает вызов, что ваше приложение разбивается http://stackoverflow.com/a/15823348/5425358 – tlastowka

ответ

1

Модуль json Python не пытается выяснить, как сериализовать произвольные объекты. Он знает только об Python types that have an equivalent JSON type: dict, list, str, int, float, bool, None. Вам нужно указать, как сбрасывать другие типы. Модели SQLAlchemy могут быть особенно сложными: существует много типов столбцов, которые не имеют эквивалентного типа JSON, вы вставляете отношения или просто включаете их внешние ключи, а также о гибридных свойствах и т. Д. Вместо того, чтобы пытаться принимать решения для вас, Python требует, чтобы вы рассказали, как уменьшить сложный объект до основных типов.

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