![](/img/trans.png)
[英]SQLALCHEMY: Problem with subquery select, How do i a exact subquery with outerjoin?
[英]How do I use SQLAlchemy filter subquery?
我使用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
必須some_join_subquery
什么?
使用關系的any
查詢屬性。
Object.query.filter(
Object.category_id == category.id,
Object.values.any(name == 'Category Property'),
db.not_(Object.values.any(name == 'Other Property'))
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.