首页 > 解决方案 > User.query.filter_by(id=user_id).first() 和 User.query.get(user_id) 在 Flask Sql Alchemy 中返回 None

问题描述

根据路由参数传递的user_id查询用户时遇到错误。我在许多其他函数中使用了相同的方法,它们都没有抛出任何错误。我的数据库中有具有相应 ID 的用户。这个查询不应该检测到任何错误,但它确实并且非常感谢任何帮助。

函数中的 target_user 变量被分配为 None ,这给了我错误

"NoneType' object has no attribute 'id'"

这是用户模型


followers = db.Table('followers',
    db.Column('follower_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('followed_id', db.Integer, db.ForeignKey('user.id'))
)


class User(UserMixin, db.Model):
    __tablename__ = 'user'

    id = db.Column(db.Integer, primary_key=True)
    user_handle = db.Column(db.String(15), unique=True)
    display_name = db.Column(db.String(30), nullable=False)
    password = db.Column(db.String(20), nullable=False)
    profile_picture_url = db.Column(db.String(100), nullable=True, default="./static/user_media/default_egg.png")
    # profile_description = db.Column(db.String(140), nullable=True)
    tweets = db.relationship('Tweet', backref="owner")

    # relationships
    liked = db.relationship('LikeTweet', foreign_keys="LikeTweet.liked_by",
                            backref="user", lazy="dynamic")

    def like_tweet(self, tweet):
        if not self.has_liked_tweet(tweet):
            like = LikeTweet(liked_by=self.id, liked_tweet=tweet.id)
            db.session.add(like)

    def unlike_tweet(self, tweet):
        if self.has_liked_tweet(tweet):
            LikeTweet.query.filter_by(
                liked_by=self.id,
                liked_tweet=tweet.id).delete()

    def has_liked_tweet(self, tweet):
        return LikeTweet.query.filter(
            LikeTweet.liked_by == self.id,
            LikeTweet.liked_tweet == tweet.id).count() > 0

    followed = db.relationship('User', secondary=followers,
                            primaryjoin=(followers.c.follower_id == id),
                            secondaryjoin=(followers.c.followed_id == id),
                            backref=db.backref('followers', lazy='dynamic'),
                            lazy='dynamic')

    def follow(self, user):
        if not self.is_following(user):
            self.followed.append(user)
            return self

    def unfollow(self, user):
        if self.is_following(user):
            self.followed.remove(user)
            return self

    def is_following(self, user):
        return self.followed.filter(followers.c.followed_id == user.id).count() > 0

这是我从中进行查询的功能

@main.route('/follow/<user_id>')
@login_required
def follow_user(user_id):
    referrer = request.headers.get("Referer")

    target_user = User.query.filter_by(id=user_id).first()
    print(target_user)

    if current_user.is_following(target_user):
        current_user.unfollow(target_user)
        db.session.commit()
    else:
        current_user.follow(target_user)
        db.session.commit()

    return redirect(referrer)

标签: pythonflasksqlalchemy

解决方案


推荐阅读