我需要写两个这样的类:
class Item(Base, DBBase):
__tablename__ = 'items'
id = Column(Integer, primary_key = True)
name = Column(String)
description = Column(String)
price = Column(Float, default = 0)
on_sell = Column(Boolean, default = False)
img = Column(String)
attributes = relationship('ItemAttribute')
def __init__(self, name, description):
self.name = name
self.description = description
class ItemAttribute(Base, DBBase):
__tablename__ = 'itemattributes'
id = Column(Integer, primary_key = True)
name = Column(String, nullable = False)
value = Column(String, nullable = False)
item_id = Column(Integer, ForeignKey('items.id'))
item = relationship('Item')
def __init__(self, name, value):
self.name = name
self.value = value
一个项目可以拥有多个属性,我需要: 1.在类Item上插入一些方法,以便轻松地为它执行CURD(插入,删除,更新和查询)属性。我需要搜索项目的属性并返回它的相应值。 2.能够按属性搜索项目。例如,某些项目具有“Feature”=“True”的属性。我需要获得具有此属性的所有项目。
感谢您的帮助。 : - )
答案 0 :(得分:2)
如果将backref添加到ItemAttribute关系中:
item_id = Column(Integer, ForeignKey('items.id', onupdate='CASCADE', ondelete='CASCADE'))
item = relationship(Items, backref='attributes')
这将创建包含ItemAttribute的Item.attributes []数组。如果您使用的是mysql,也可以添加onupdate和ondelete。
然后在查询时,您可以这样做:
rs = mySession.query(Items)
firstItem = rs.first()
for attribute in firstItem.attributes:
print attribute
查询时,您可以通过加入backref进行过滤:
rs = mySession.query(Items).join(Items.attributes).filter(ItemAttribute.name=='somethingSpecial')
此外,如果它是一对一的关系(但在这种情况下不是),您可以通过指定uselist = False跳过列表:
item = relationship(ITEM, backref='attribute', uselist=False)