如何查看用户是否没有多对多关系?

时间:2019-12-27 06:22:51

标签: python flask sqlalchemy flask-sqlalchemy

所以我想知道如何查看用户是否没有多对多关系。这是我当前的代码:

seen = db.Table("seen", db.Column("user_id", db.Integer, db.ForeignKey("user.id")), db.Column("match_id", db.Integer, db.ForeignKey("user.id")))

//

seenmatch = db.relationship("User", secondary=seen, primaryjoin=(seen.c.user_id == id), secondaryjoin=(seen.c.match_id == id), backref=db.backref("seenmatches", lazy="dynamic"), lazy="dynamic")

//

users = User.query.filter_by(gender=gender).filter(or_(User.height == height, User.grade == grade)).filter(User.username != current_user.username).filter(seen.c.user_id != current_user.id).limit(10).all()

.filter(seen.c.user_id!= current_user.id)

上面的粗体部分是我正在尝试使用的部分。我要完成的工作是显示10个用户或与该用户匹配的对象。用户刷新页面时,不应再次看到相同的匹配项。为了确保用户不会再看到其他匹配项,我添加了多对多关系。唯一的问题是使过滤器正常工作,以不显示已经被看到的用户。当我运行此代码时,它根本没有显示任何用户。如果有人可以帮助我,将不胜感激!

1 个答案:

答案 0 :(得分:0)

您想要的被称为 anti join 。您可以通过两个简单的步骤来实现它:

  • 首先,在辅助条件User下,执行从seenseen.c.user_id == current_user.id的外部联接。这样,当前用户已经看到的用户将填充seen列,而所有其他用户的列将为空。
  • 然后仅过滤seen列为空的那些用户。

所以,像这样:

User.query \
    .outerjoin(seen, (User.id == seen.c.match_id)
                   & (seen.c.user_id == current_user.id)) \
    .filter(seen.c.user_id == None)