需求: 用户进行留言,也要可以通过留言找到对应的用户
这样用户和留言的关系:1对多
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class UserInfo(db.Model):
# 因为I是大写,所以数据库自动生成时,会加"_",数据库名变成:user_info
# 自定义表名,如果不写,默认模型名即上面的:user_info
# __tablename__ = 'userinfo'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
# 可查看Column的__init__参数内容,可填参数有很多
username = db.Column(db.String(50), nullable=False)
password = db.Column(db.String(255), nullable=False)
phone = db.Column(db.String(11), unique=True, nullable=False)
comments = db.relationship('Comment', backref='user')
# backref 是本函数的名字,用于其他地方引用,这个可以先忽略,因为关联的是评论表,本次内容没有
class MessageBoard(db.Model):
# 管理用户留言
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
content = db.Column(db.String(255), nullable=False)
create_at = db.Column(db.DateTime, default=datetime.now)
user_id = db.Column(db.Integer, db.ForeignKey('user_info.id')) # 外键
user = db.relationship('User', backref='messages') # 用户表关联留言表,
relationship 和外键不一样,外键是真实存在于表结构中的,而relationship只是存在逻辑系统中,在物理上或表内容结构上是找不到的对应关系的,类似于内存中,只是在当前flask中可以通过留言表找到用户表
注意:
relationship 只能单向关联,不能双向关联,否则会报错,即模型(UserInfo)和(MessageBoard)不能都相互关联对方,可以关联其它表。
# view.py
......
# ---->>>: 留言板
@user_bp.route('/messages_board', methods=['GET'])
def messages_board():
uid = session.get('uid')
user = User.query.get(uid)
page = int(request.args.get('page', 1))
pagination = MessageBoard.query.filter().order_by(-MessageBoard.create_at) \
.paginate(page=page, per_page=5)
# pagination 根据条件取到留言表的对象,是个列表
return render_template('user/messages_board.html',
user=user,
pagination=pagination)
<!--messages_board.html-->
{% extends 'base.html' %}
{% block newcontent %}
<!--留言板的显示-->
<div id="comment_item">
<!--判断评论列表对象有没有值-->
{% if pagination.items %}
<!--循环评论列表对象,取出每一个对象-->
{% for message in pagination.items %}
<div class="item">
<div class="item_left">
<!--应用relationship:通过message对象找到与之关联的user表,然后再通过user表找到用户头像,外键的话没有这么方便,要先找到对应的外键id,再去user表去查询找到icon-->
<img src="{% if message.user.icon %}
{{ url_for('static', filename=message.user.icon) }}
{% else %}
{{ url_for('static', filename='images/touxiang.png') }}
{% endif %} " alt="" class="message-image">
</div>
<div class="item_right">
<div>
<!--应用relationship:通过message对象找到关联的user表,然后再通过user表找到用户名-->
{% if message.user.username %}
<span>{{ message.user.username }}</span>
{% else %}
<span>匿名用户</span>
{% endif %}
<!--通过message对象找到留言的时间-->
<span>{{ message.create_at }}</span>
</div>
<div>
<!--通过message对象找到留言的内容-->
<div>{{ message.content }}</div>
</div>
</div>
</div>
{% endfor %}
{% else %}
<div class="item" style="color: gray">
当前还没有留言哦~~~~
</div>
{% endif %}
</div>
{% endblock %}