Не удается получить ассоциативную таблицу для быстрой загрузки с фильмом для конкретного пользователя, чтобы показать, отслеживается ли пользователь, который добавил фильм, или нет Flask

#flask #sqlalchemy

#flask #sqlalchemy

Вопрос:

 class Movie(db.Model):
    __searchable__ = ['genre']
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(200))
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    username = db.Column(db.String(255))
    description = db.Column(db.String(100))


class User(db.Model,UserMixin):

    __tablename__ = 'user'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String, nullable=False)
    password = db.Column(db.String, nullable=False)
    movies = db.relationship('Movie', backref='author', lazy='joined')
    followed = db.relationship('User', secondary=followers,
    primaryjoin=(followers.c.follower_id==id),
    secondaryjoin=(followers.c.followed_id==id),
    backref=db.backref('followers', lazy='joined'), lazy='joined')

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

def get_all_movies_follow():
    
    qry = Movie.query.order_by(Movie.id.desc()).all()

    movies_schema = MovieSchema(many=True)

    return movies_schema.dump(qry)

    

 

Как вернуть коллекцию (массив), где у меня есть свойство, которое показывает, является ли
Когда я загружаю таблицу подписчиков, она по-прежнему не отображается в запросе.
« #movi = Movie .query.outerjoin(followers, followers.c.followed_id == Movie.user_id).options(contains_eager( Movie.us ).contains_eager(‘подписчики’)).order_by(Movie.id.desc()).all()

 Also when I try to use follow unfollow function I get Select statement 'SELECT *
FROM followers, movie AS movie_1
WHERE followers.followed_id = movie_1.user_id' returned no FROM clauses due to auto-correlation; specify correlate(<tables>) to control correlation manually.

which in short is def unfollow(id):
...         
    current_user.unfollow(user)
    db.session.commit()

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

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


So I tried adding this to Movie class:  ```following = column_property( exists().where(followers.c.followed_id==user_id)) but it has to be also restricted on current_user.id=followers.c.follower_id
 

Я думаю, может быть, оператор, который будет включен, когда я запрашиваю фильм

Ответ №1:

хорошо, так что это работает, при условии, что я включил следующее в схему для сброса в MovieSchema. Но у него есть проблема. Если нет совпадений с (followers.c.follower_id), значит, пользователь ни за кем не следит. затем я получаю пустой результат, и фильм вообще не загружается.

 class Movie(db.Model)
...
following = column_property( exists().where(followers.c.followed_id==user_id).correlate_except(followers))

and in query
qry = db.session.query(Movie).filter(followers.c.follower_id == current_user.id).all()