2012-09-07 42 views
4

我需要寫兩個類是這樣的:如何在SQLAlchemy中存儲和搜索列表?

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.插入類項目的一些方法,能夠輕而易舉地完成CURD(插入,刪除,更新和查詢)屬性。我需要搜索一個項目的屬性並返回相應的值。 2.有能力按屬性搜索項目。例如,某些項目具有「特徵」=「真」的屬性。我需要獲得具有此屬性的所有項目。

感謝您的幫助。 :-)

回答

2

如果backref添加到您的ItemAttribute關係:

item_id = Column(Integer, ForeignKey('items.id', onupdate='CASCADE', ondelete='CASCADE')) 
item = relationship(Items, backref='attributes') 

這將創建和Item.attributes []數組,它包含了ItemAttribute的。如果你使用的是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) 
+1

感謝您的幫助!順便說一句:我很少使用'backref'參數,因爲它向類中添加了一些內容,而不在類定義文件中提示任何內容,這使得該類具有一些「隱藏」屬性。 –

+1

是的,這也讓我很煩惱。我通常會用一個註釋向我的類添加一個虛擬變量,如:'attributes = None#:ItemAttribute backref'的虛擬佔位符 - 它會被覆蓋很好,但至少它是爲了您的理智和任何代碼檢查器。 –