I've created an application similar to Twitter where user's can "like" messages from other users. I am trying to get all of a particular user's messages that they "liked", to show up on a specific route. However, I am having trouble getting the message text to show up. I have created a join table, "Likes" that references information from both the "User" and "Message" table. Here is my code:
MODELS
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(
'Likes',
backref='user'
)
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')
Here is how I am retrieving information to send to Jinja:
APP.PY
@app.route('/users/show_likes')
def show_liked_warbles():
likes = Likes.query.all()
return render_template('/users/show_liked_warbles.html', likes=likes)
Trying to get liked messages to show up (g.user references the current user in session)
Jinja
{% for likes in g.user.likes %}
<h1>{{likes.message_id.text}}</h1>
{% endfor %}
From how my tables are setup, I believe that I should be able to access messages by writing, "likes.message_id.text" but nothing is appearing on the page. If I just write, "likes.message_id", id's appear, but not for text.
question from:
https://stackoverflow.com/questions/65645860/how-to-access-information-bi-directionally-from-a-through-relationship-in-sqlalc