从包含关系表的数据库将数据返回到客户端



我正在使用Angular(前端(和Flask(后端(开发一个博客系统。用于此应用程序的数据库是sqlite

我有一个博客和一个标签表,它们遵循多对多关系:

class Blog(db.Model):
id = db.Column(db.Integer,primary_key=True)
authorname=db.Column(db.String(128),nullable=False)
title=db.Column(db.String(128),nullable=False)
content=db.Column(db.Text,nullable=False)
user_id=db.Column(db.Integer,db.ForeignKey('user.id'))
tags= db.relationship('Tag',secondary=tags_blog,backref=db.backref('blogs_associated',lazy="dynamic"))
featured_image= db.Column(db.String,nullable=False)
updated_at = db.Column(db.DateTime, default=datetime.utcnow)
upvotes= db.Column(db.Integer, default=0)
class Tag(db.Model):
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(100))
tags_blog = db.Table('tags_blog',
db.Column('blog_id', db.Integer,db.ForeignKey('blog.id')),
db.Column('tag_id',db.Integer,db.ForeignKey('tag.id'))
)  

我在后端有一个路由,可以查询并返回特定id的博客,

@blogs.route('/blog/<int:id>', methods=["GET"])
def show_blog(id):
blog_by_id= Blog.query.filter_by(id=id).first_or_404()
found_blog ={
"id": blog_by_id.id,
"title":blog_by_id.title,
"content":blog_by_id.content,
"authorname":blog_by_id.authorname,
"featured_image":blog_by_id.featured_image,
"tags":[]
}

return jsonify({"blog": found_blog})

正如您在路由中看到的,found_blog 中的 tags 属性为空,因为当我尝试将blog_by_id.tags 添加到 tags属性时,我收到一条错误消息,指出Tag 类型的对象不可 JSON 序列化

我尝试了以下代码,但遇到了相同的错误:

for x in blog_by_id.tags:
found_blog["tags"].append(x)

如何访问与每个博客相关的标签,以便将完整的博客详细信息返回到客户端?

你可以试试下面的代码

class Blog(db.Model):
id = db.Column(db.Integer,primary_key=True)
authorname=db.Column(db.String(128),nullable=False)
title=db.Column(db.String(128),nullable=False)
content=db.Column(db.Text,nullable=False)
user_id=db.Column(db.Integer,db.ForeignKey('user.id'))
tags= db.relationship('Tag',secondary=tags_blog,backref=db.backref('blogs_associated',lazy="dynamic"))
featured_image= db.Column(db.String,nullable=False)
updated_at = db.Column(db.DateTime, default=datetime.utcnow)
upvotes= db.Column(db.Integer, default=0)
@property
def serialize(self):
return {
'id': self.id,
'authorname': self.authorname,
'title': self.title,
'content': self.content,
'user_id': self.user_id,
'featured_image': self.featured_image,
'updated_at': self.updated_at,
'upvotes': self.upvotes
}
class Tag(db.Model):
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(100))
@property
def serialize(self):
return {
'id': self.id,
'name': self.name     
}

import josn
@blogs.route('/blog/<int:id>', methods=["GET"])
def show_blog(id):
blog= Blog.query.filter_by(id=id).first_or_404()
data = blog.serialize
data['tags'] = []
for tag in blog.tags.all():
data['tags'].append(tag.serialize)   
return jsonify(data)

最新更新