2014-09-09 2 views
2

Я пытался сделать rest apis с фляжкой, где я использую колбу-sqlalchemy как ORM. Вот мои классы моделей.Jsonify колба-sqlalchemy много-к-одному отношение в колбе

class Post(db.Model): 
__tablename__ = 'post' 
postid = db.Column(db.Integer,primary_key=True) 
post = db.Column(db.String(64)) 
userid = db.Column(db.Integer,db.ForeignKey('user.userid')) 

#serialize property used for serializing this class to JSON 
@property 
def serialize(self): 
    return { 
     'postid': self.postid, 
     'post': self.post, 
     'author':self.author 
    } 

и

class User(db.Model): 
userid = db.Column(db.Integer,primary_key=True) 
username = db.Column(db.String(30)) 
email = db.Column(db.String(20)) 
posts = db.relationship('Post',backref="author",lazy='dynamic') 

#serialize property used for serializing this class to JSON 
@property 
def serialize(self): 
    return { 
     'username': self.username, 
     'email': self.email 
    } 

И база данных populated.now я пытаюсь сделать JSON из этого

class PostList(Resource): 
    def get(self): 
     posts = DL_models.Post.query.all() 
     posts = [post.serialize for post in posts] 
     return { 'posts': posts } 

api.add_resource(PostList, '/twitter/api/v1.0/posts', endpoint = 'posts') 

Это отлично работает, когда я изменить сериализации метода в сообщении для

@property 
def serialize(self): 
    return { 
     'postid': self.postid, 
     'post': self.post, 
     'author':self.postid 
    } 

Thi s возвращает ожидаемый результат, но JSON, когда я меняюсь к 'author':self.author я получаю ошибку

TypeError: <app.DL_models.User object at 0x7f263f3adc10> is not JSON serializable 

Я понимаю, что я должен назвать сериализации на этих вложенных объектов, а также, но я не мог понять, как это сделать.

Или, пожалуйста, поделитесь своим опытом, чтобы закодировать отношения в sqlalchemy.

ответ

4

Поскольку вы уже используете Flask-Restful, считаете ли вы использование своих встроенных в data marshaling solution?

Однако для построения сложных структур данных я обнаружил, что Marshmallow делает задачу в тысячу раз лучше, даже упрощая встраивание сериализаторов в другие. Существует также расширение Flask, предназначенное для проверки конечных точек и выходных URL-адресов.

+0

Большое спасибо! вы спасли мой день. Как-то я пропустил встроенное решение для маршалинга данных Flask-restful, оно работает так, как ожидалось. – Tony

0

Это пунт, но вы попробовали ниже?

«автор»: self.author.username

Из сообщения об ошибке я предполагаю, что это становится для пользователя, но не знает, что вы хотите от него.

+0

Я пробовал, что и это сработает. Но это даст только это имя пользователя. То, что я хочу, - это вложенная структура, где автор должен иметь все сведения об этом пользователе. Спасибо за ответ !! – Tony