【问题标题】:How do I use SQLAlchemy filter subquery?如何使用 SQLAlchemy 过滤子查询?
【发布时间】:2015-05-11 23:48:16
【问题描述】:

我使用 SQLAlchemy 的时间不长。 我有这样的结构:

class Category(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(140))
    parent_id = db.Column(db.Integer, db.ForeignKey('category.id'))
    parent = db.relationship("Category", remote_side=id, backref="sub_categories")

    def __repr__(self):
        return '<Category: {0.name}>'.format(self)

class Object(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(140))
    category_id = db.Column(db.Integer, db.ForeignKey('category.id'), nullable=False)
    category = db.relationship('Category', backref="objects")
    values = db.relationship("Value", secondary="object_value", backref="objects")

    def __repr__(self):
        return '<Object: {0.name}>'.format(self)


class Property(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(140))
    categories = db.relationship("Category", secondary="category_property", backref="properties")

    def __repr__(self):
        return '<Property: {0.name}>'.format(self)


class Value(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    value = db.Column(db.String(140))
    property_id = db.Column(db.Integer, db.ForeignKey("property.id"))
    prop = db.relationship('Property', backref="values")

    def __repr__(self):
        return '<Value: {0.prop.name}={0.value}>'.format(self)

db.Table(
    'category_property', db.Model.metadata,
    db.Column('category_id', db.Integer, db.ForeignKey('category.id')),
    db.Column('property_id', db.Integer, db.ForeignKey('property.id'))
)

db.Table(
    'object_value', db.Model.metadata,
    db.Column('object_id', db.Integer, db.ForeignKey('object.id')),
    db.Column('value_id', db.Integer, db.ForeignKey('value.id'))
)

使用它我尝试获取类别的所有对象,但在对象中我只想获取类别中使用的属性。我的意思是这样的:

category = Category(name="Category")

category_property = Property(name="Category Property")
category.properties.append(category_property)
value_category_property = Value(prop=category_property, value="value")

other_property = Property(name="Other Property")
value_other_property = Value(prop=other_property, value="value")

obj = Object(name="Entry", category=category)
obj.values.append(value_category_property)
obj.values.append(value_other_property)

db.session.add(obj)
db.session.commit()

for obj in db.session.query(Object)\
                     .some_join_subquery()\
                     .filter(Object.category == category.id)\
                     .all():
    assert value_category_property in obj.values
    assert value_other_property not in obj.values

some_join_subquery 中必须包含什么?

【问题讨论】:

  • 你能举例说明你真正想从查询中得到什么吗?这个问题目前还不是很清楚。编辑:也许如果你给出一个关于你期望的原始 SQL 的例子,我们可以帮助将它翻译成 SQLAlchemy
  • 我想取回所有 objects 以及预加载的相关 values。但是,values 必须被包含在选定的category 中的properties 过滤。首先我尝试的是构建原始 SQL 查询。但这对我来说太复杂了)实际上我想要它从category中不包含的预加载“事物”中排除properties。 @TomDalton

标签: python orm flask sqlalchemy


【解决方案1】:

使用关系的any 查询属性。

Object.query.filter(
    Object.category_id == category.id,
    Object.values.any(name == 'Category Property'),
    db.not_(Object.values.any(name == 'Other Property'))
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-22
    • 2016-06-09
    • 2017-03-24
    • 2015-01-15
    • 2021-10-20
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    相关资源
    最近更新 更多