【问题标题】:how to create a like and dislike function on python flask如何在python烧瓶上创建一个喜欢和不喜欢的功能
【发布时间】:2022-01-11 14:08:03
【问题描述】:

所以我一直在尝试为我的问答网站制作类似的功能。但是,我被困在models.py 的数据库关系部分。我收到一个错误提示

“sqlalchemy.exc.InvalidRequestError:一个或多个映射器无法初始化 - 无法继续初始化其他映射器。触发映射器:'mapped class User->user'。原始异常是:无法确定之间的连接条件关系 User.posts 上的父/子表 - 有多个链接表的外键路径。指定 'foreign_keys' 参数,提供应计为包含对父表的外键引用的那些列的列表。"

这是我的用户和帖子类代码

class Post(db.Model):
    id = db.Column("id", db.Integer, primary_key=True)
    title = db.Column("title", db.String(200))
    text = db.Column("text", db.String(100))
    date = db.Column("date", db.String(50))
    #Create Foreign Key
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
    comments = db.relationship("Comment", backref="post", cascade="all, delete-orphan", lazy=True)
    recipient_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    likes = db.relationship('PostLike', backref='post', lazy='dynamic')

和我的用户类

class User(db.Model):
    id = db.Column("id", db.Integer, primary_key=True)
    first_name = db.Column("first_name", db.String(100))
    last_name = db.Column("last_name", db.String(100))
    email = db.Column("email", db.String(100))
    password = db.Column(db.String(255), nullable=False)
    registered_on = db.Column(db.DateTime, nullable=False)
    posts = db.relationship("Post", backref="user", lazy=True)
    comments = db.relationship("Comment", backref="user", lazy=True)

    liked = db.relationship(
        'PostLike',
        foreign_keys='PostLike.user_id',
        backref='user', lazy='dynamic'
    )

    def like_post(self, post):
        if not self.has_liked_post(post):
            like = PostLike(user_id=self.id, post_id=post.id)
            db.session.add(like)

    def unlike_post(self, post):
        if self.has_liked_post(post):
            PostLike.query.filter_by(
                user_id=self.id,
                post_id=post.id).delete()

    def has_liked_post(self, post):
        return PostLike.query.filter(
            PostLike.user_id == self.id,
            PostLike.post_id == post.id).count() > 0

models.py 中我的 postlike 类

class PostLike(db.Model):
    __tablename__ = 'post_like'
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    post_id = db.Column(db.Integer, db.ForeignKey('post.id'))

like_action 函数的烧瓶文件

@app.route('/like/<int:post_id>/<action>')
def like_action(post_id, action):
    post = Post.query.filter_by(id=post_id).first_or_404()
    if action == 'like':
        session['user_id'].like_post(post)
        db.session.commit()
    if action == 'unlike':
        session['user_id'].unlike_post(post)
        db.session.commit()
    return redirect(request.referrer)

【问题讨论】:

    标签: python html flask flask-sqlalchemy


    【解决方案1】:

    您有两个外键指向 Post 用户:

    user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
    recipient_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    

    所以,您的用户不知道指向哪里

    posts = db.relationship("Post", backref="user", lazy=True)
    

    在用户模型中有recipient = db.relationship (..)author = db.relationship (..) 之类的东西,并制作posts = db.relationship("Post", back_populates="author", lazy=True)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多