4

我需要编写两个这样的类:

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' 的属性。我需要获取所有具有此属性的项目。

感谢帮助。:-)

4

1 回答 1

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)
于 2012-09-07T07:53:09.783 回答