4

私はこのような2つのクラスを書く必要があります:

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つのアイテムが複数の属性を所有できるため、次のことを行う必要があります。1.クラスItemにいくつかのメソッドを挿入して、そのアイテムのCURD(挿入、削除、更新、およびクエリ)属性を簡単に実行します。アイテムの属性を検索して、それに対応する値を返す必要があります。2.属性でアイテムを検索する機能があります。たとえば、一部のアイテムには「機能」=「真」の属性があります。この属性を持つすべてのアイテムを取得する必要があります。

手伝ってくれてありがとう。:-)

4

1 に答える 1

2

ItemAttribute関係にbackrefを追加する場合:

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')

さらに、それが1対1の関係である場合(ただし、この場合はそうではありません)、uselist=Falseを指定してリストをスキップできます。

item = relationship(ITEM, backref='attribute', uselist=False)
于 2012-09-07T07:53:09.783 に答える