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.