首页 > 解决方案 > Flask-SQLALCHEMY 中条件的自引用关系

问题描述

我正在尝试构建烧瓶应用程序,其中用户拥有自己独特的自构建类别集

Category_set 是根据邻接列表关系 sqlalchemy 构建的。模型看起来像这样:

user_categories = db.Table('user_cat',
                           db.Column('cat_id', db.Integer, db.ForeignKey('category.id'), primary_key=True),
                           db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True)
                           )
class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(60), nullable=False)
   

class Category(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    category_parent_id = db.Column(db.Integer, db.ForeignKey(id))
    name = db.Column(db.String(50), nullable=False)
    users = db.relationship('User', secondary=user_categories, lazy='subquery',
                            backref=db.backref('category_set', lazy=True))
    subcategories = db.relationship(
        "Category",
        cascade="all, delete-orphan",
        backref=db.backref("parent", remote_side=id, lazy='subquery'),
        collection_class=attribute_mapped_collection("name"))

现在的问题:假设我进行查询:

Category.query.join(Category.users).filter(User.id == current_user.id).filter(
    Category.category_parent_id == 1).all()

我将始终只为 current_user 而过滤子类别而不是子类别。我试图以某种方式弄清楚我似乎在建立关系时必须对我进行过滤。

我写了查询(可能是通过 user_id 添加过滤器)看起来像解决了我的问题,但无法在 sqlalchemy 上重现它

    Select * from category as cat 
     join public.category as cat_1 on 
        (cat.id=cat_1.category_parent_id)
    join public.user_cat as uc on
        (uc.cat_id=cat_1.id)

我试图添加某种primaryjoin或其他东西,但是它总是失败。任何想法或更简单的解决方案?

谢谢!

标签: pythonflasksqlalchemyflask-sqlalchemy

解决方案


推荐阅读