Возврат данных клиенту из базы данных, содержащей реляционные таблицы - PullRequest
0 голосов
/ 14 января 2020

Я разрабатываю систему ведения блогов, используя Angular (Front-end) и Flask (Back-end). База данных, используемая для этого приложения: 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'))
)  

У меня есть маршрут в серверной части, который запрашивает и возвращает блог с указанными c 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})

Как видно из маршрута, свойство tags внутри found_blog пусто, поскольку при попытке добавить blog_by_id.tags к свойству tags я получаю сообщение об ошибке: Объект типа Tag не JSON serializable .

Я пробовал следующий код, но получил ту же ошибку:

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

Как получить доступ к тегам, относящимся к каждому блогу, чтобы я мог вернуть полные сведения о блоге на стороне клиента?

1 Ответ

1 голос
/ 14 января 2020

Вы можете попробовать ниже код

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...