Python Sqlalchemy将多对多关系数据加载到视图中的最有效方法

时间:2018-04-09 12:23:01

标签: python sqlalchemy

我有一张桌子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 %}

它有效,但这是最好的方法吗?我想知道这是否是最佳做法,因为加载时间表可能会导致性能问题。

0 个答案:

没有答案