Flask SQLAlchemy反向包含多对多查询

Flask SQLAlchemy反向包含多对多查询,flask,sqlalchemy,flask-sqlalchemy,Flask,Sqlalchemy,Flask Sqlalchemy,我对炼金术很陌生。 对于这个项目,我使用的是flask和sqlalchemy 我需要做的一个路由是将用户添加到某个组。因此,我需要创建一个不包括在此组中的用户列表 我做了一个SQL语句,并在我的数据库中进行了尝试,这给了我需要的结果,我只是不擅长将其转换为SQLAlchemy 选择id,从id不在其中的用户发送电子邮件从用户组选择用户id,其中组id=1 我的模特看起来像这样 UserGroup = db.Table( "user_group", db.Mod

我对炼金术很陌生。 对于这个项目,我使用的是flask和sqlalchemy

我需要做的一个路由是将用户添加到某个组。因此,我需要创建一个不包括在此组中的用户列表

我做了一个SQL语句,并在我的数据库中进行了尝试,这给了我需要的结果,我只是不擅长将其转换为SQLAlchemy

选择id,从id不在其中的用户发送电子邮件从用户组选择用户id,其中组id=1

我的模特看起来像这样

UserGroup = db.Table(
    "user_group",
    db.Model.metadata,
    db.Column("user_id", db.Integer, db.ForeignKey("users.id")),
    db.Column("group_id", db.Integer, db.ForeignKey("groups.id")),
)
    
class Group(db.Model, RestrictionsMixin):
    __tablename__ = "groups"
    __versioned__ = {}
    __restrictions__ = {}

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), nullable=False, unique=True)

class User(db.Model):
    __tablename__ = "users"
    __versioned__ = {}

    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(250), unique=True, nullable=False)
    _password = db.Column(db.LargeBinary(60), nullable=False)
    authenticated = db.Column(db.Boolean, default=False)
    active = db.Column(db.Boolean, default=True, nullable=False)
    email_confirmation_sent_on = db.Column(db.DateTime, nullable=True)
    email_confirmed = db.Column(db.Boolean, nullable=True, default=False)
    email_confirmed_on = db.Column(db.DateTime, nullable=True)
    registered_on = db.Column(db.DateTime, nullable=True)
    last_logged_in = db.Column(db.DateTime, nullable=True)

    groups = db.relationship("Group", secondary="user_group", backref="users")

你可以这样做:

user_group_subquery = (
    db.session.query(UserGroup.c.user_id).filter(UserGroup.c.group_id == 1).subquery()
)
db.session.query(User.id, User.email).filter(~User.id.in_(user_group_subquery))

.

谢谢,巴斯,我已将我的解决方案更改为您的解决方案。在过去的几天里,我一直在浏览整个SQLAlchemy文档,以了解它的各个方面。我发现了一个基本上使用db.session.queryUser.from_statementtextselect*的小方法,从id不在的用户中选择用户\u id from user_group其中group_id=:group.paramsgroup=id。所有这些方法都还有一些文档要处理。谢谢你的解决方案。