我有一张桌子User
。
我有一张表Post
。
用户可以创建多个帖子,这些帖子保存在Post
表格中。
用户可以互相关注。此关系存储在多个表UserFollowUser
中。
class UserFollowUser(Base):
__tablename__ = 'userfollowsuser'
user_id_follower_from = Column(Integer, ForeignKey('users.id'), primary_key=True)
user_id_follower_to = Column(Integer, ForeignKey('users.id'), primary_key=True)
date_added = Column(DateTime, nullable=False)
class User(UserMixin, Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
email = Column(Text, nullable=False, unique=True)
password = Column(Text, nullable=False)
date_registered = Column(DateTime, nullable=False)
# Foreign Keys
belongs_to_user_addresses = relationship('Post', back_populates="belongs_to_user_relation")
# Foreign Keys for many to many follow
user_to = relationship('UserFollowUser', backref='to_user', primaryjoin=id==UserFollowUser.user_id_follower_to)
user_from = relationship('UserFollowUser', backref='from_user', primaryjoin=id==UserFollowUser.user_id_follower_from )
# etc ...
class Post(Base):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True)
title = Column(Text, nullable=False)
description = Column(Text, nullable=True)
created_on = Column(DateTime, nullable=False)
hidden_post = Column(Boolean, nullable=False, default=False)
# Foreign Keys
created_by_user_id = Column(Integer, ForeignKey('users.id'))
belongs_to_user_relation = relationship("User", back_populates="belongs_to_user_addresses")
向所有表添加数据效果很好。
现在我想显示某个用户所关注的用户帖子。所以这是一个经典的时间表。
我有一种工作方法,但是在我获取数据的时候并没有像往常那样使用这种关系。我只需将Post
加入UserFollowUser
并按current_user
过滤(时间轴会显示在个人资料中)。
posts_timeline = Post.query.join(UserFollowUser, UserFollowUser.user_id_follower_to == Post.created_by_user_id).filter_by(user_id_follower_from=current_user.id).order_by(desc("created_on")).all()
在视图中:
{% for post in posts_timeline %}
<div class="row">
<div class="col-xs-12 text-center">
<div class="post-item">
<h2> {{ post.title }} </h2>
<p> {{ post.description }} </p>
<p> {{ post.created_by_user_id }} </p>
<p> {{ post.created_on }} </p>
</div>
</div>
</div>
{% endfor %}
它有效,但这是最好的方法吗?我想知道这是否是最佳做法,因为加载时间表可能会导致性能问题。