2012-09-07 2 views
4

J'ai besoin d'écrire deux classes comme ceci:Comment stocker et rechercher une liste dans 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 

Un élément peut posséder plusieurs attributs, et je dois: 1. insérer des méthodes sur la classe Item pour faire facilement CURD (insertion, suppression, mise à jour et requête) attributs pour cela. Je dois rechercher un attribut d'un élément et retourner sa valeur correspondante. 2. avoir la possibilité de rechercher des éléments par attributs. Par exemple, certains éléments ont les attributs de 'Feature' = 'True'. Je dois obtenir tous les articles qui ont cet attribut.

Merci pour votre aide. :-)

Répondre

2

Si vous ajoutez backref sur votre relation ItemAttribute:

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

Cela va créer et Item.attributes tableau [] qui contient de l'ItemAttribute. Vous pouvez également ajouter onupdate et ondelete si vous utilisez mysql.

Ensuite, lorsque vous interrogez, vous pouvez le faire:

rs = mySession.query(Items) 
firstItem = rs.first() 
for attribute in firstItem.attributes: 
    print attribute 

Lorsque vous interroger pouvez filtrer en rejoignant le backref:

rs = mySession.query(Items).join(Items.attributes).filter(ItemAttribute.name=='somethingSpecial') 

De plus, si elle est une relation un à un (mais il est pas dans ce cas), vous pouvez passer la liste en spécifiant uselist = Faux:

item = relationship(ITEM, backref='attribute', uselist=False) 
+1

Merci pour votre aide! BTW: J'utilise rarement l'argument 'backref' parce qu'il a ajouté quelque chose à une classe sans rien suggérer dans le fichier de définition de classe qui fait que la classe a des attributs 'cachés'. –

+1

Oui, ça m'agace aussi. J'ajoute généralement une variable fictive à ma classe avec un commentaire, comme: 'attributes = None #: espace réservé Dummy pour ItemAttribute backref' - il sera écrasé très bien, mais au moins il est là pour votre santé mentale et quel que soit l'inspecteur de code. –

Questions connexes