所以我想知道如何查看用户是否没有多对多关系。这是我当前的代码:
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个用户或与该用户匹配的对象。用户刷新页面时,不应再次看到相同的匹配项。为了确保用户不会再看到其他匹配项,我添加了多对多关系。唯一的问题是使过滤器正常工作,以不显示已经被看到的用户。当我运行此代码时,它根本没有显示任何用户。如果有人可以帮助我,将不胜感激!
答案 0 :(得分:0)
您想要的被称为 anti join 。您可以通过两个简单的步骤来实现它:
User
下,执行从seen
到seen.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)