简体   繁体   中英

How to display a homepage for a twitter-like app that only shows messages from the current users' followed users (Flask-SQLAlchemy)?

Given the classes I've defined in models.py for my Flask-SQLAlchemy app:

class Follows(db.Model):
"""Connection of a follower <-> followed_user."""

__tablename__ = 'follows'

user_being_followed_id = db.Column(
    db.Integer,
    db.ForeignKey('users.id', ondelete="cascade"),
    primary_key=True,
)

user_following_id = db.Column(
    db.Integer,
    db.ForeignKey('users.id', ondelete="cascade"),
    primary_key=True,
)

class Likes(db.Model):
"""Mapping user likes to warbles."""

__tablename__ = 'likes' 

id = db.Column(
    db.Integer,
    primary_key=True
)

user_id = db.Column(
    db.Integer,
    db.ForeignKey('users.id', ondelete='cascade')
)

message_id = db.Column(
    db.Integer,
    db.ForeignKey('messages.id', ondelete='cascade'),
    unique=True
)

class User(db.Model):
"""User in the system."""

__tablename__ = 'users'

id = db.Column(
    db.Integer,
    primary_key=True,
)

email = db.Column(
    db.Text,
    nullable=False,
    unique=True,
)

username = db.Column(
    db.Text,
    nullable=False,
    unique=True,
)

image_url = db.Column(
    db.Text,
    default="/static/images/default-pic.png",
)

header_image_url = db.Column(
    db.Text,
    default="/static/images/warbler-hero.jpg"
)

bio = db.Column(
    db.Text,
)

location = db.Column(
    db.Text,
)

password = db.Column(
    db.Text,
    nullable=False,
)

messages = db.relationship('Message')

followers = db.relationship(
    "User",
    secondary="follows",
    primaryjoin=(Follows.user_being_followed_id == id),
    secondaryjoin=(Follows.user_following_id == id)
)

following = db.relationship(
    "User",
    secondary="follows",
    primaryjoin=(Follows.user_following_id == id),
    secondaryjoin=(Follows.user_being_followed_id == id)
)

likes = db.relationship(
    'Message',
    secondary="likes"
)

def __repr__(self):
    return f"<User #{self.id}: {self.username}, {self.email}>"

def is_followed_by(self, other_user):
    """Is this user followed by `other_user`?"""

    found_user_list = [user for user in self.followers if user == other_user]
    return len(found_user_list) == 1

def is_following(self, other_user):
    """Is this user following `other_use`?"""

    found_user_list = [user for user in self.following if user == other_user]
    return len(found_user_list) == 1

class Message(db.Model):
"""An individual message ("warble")."""

__tablename__ = 'messages'

id = db.Column(
    db.Integer,
    primary_key=True,
)

text = db.Column(
    db.String(140),
    nullable=False,
)

timestamp = db.Column(
    db.DateTime,
    nullable=False,
    default=datetime.utcnow(),
)

user_id = db.Column(
    db.Integer,
    db.ForeignKey('users.id', ondelete='CASCADE'),
    nullable=False,
)

user = db.relationship('User')

How can I present the homepage of my app to a logged-in user so that they are only viewing messages from users they follow, as well as the logged-in user's own messages? I've been working on the route, and I figure that.filter will have something to do with it, but I can't figure out what to pass into it:

@app.route('/')
def homepage():
"""Show homepage:

- anon users: no messages
- logged in: 100 most recent messages of followed_users
"""

if g.user:
    messages = (Message
                .query
                .filter()
                .order_by(Message.timestamp.desc())
                .limit(100)
                .all())

    return render_template('home.html', messages=messages)

else:
    return render_template('home-anon.html')

Would love any advice or possible solutions!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM