0

私は2つのテーブルを持っていimageますrestaurant. それらの間に多対多の関係を設定しました。

テーブル定義の関連部分は次のとおりです。

images_assoc = Table('restaurant_image_assoc', Base.metadata,
        Column('restaurant', Integer(unsigned=True),
            ForeignKey('restaurant.id')),
        Column('image', Integer(unsigned=True),
            ForeignKey('image.id')))

class Image(Base):
    __tablename__ = 'image'
    id = Column(Integer(unsigned=True), primary_key=True)
    reports = Column(TinyInt, nullable=False, default=0)
    created_at = Column(DateTime, default=datetime.now)

class Restaurant(Base):
    __tablename__ = 'restaurant'
    id = Column(Integer(unsigned=True), primary_key=True)
    images = relationship(Image, secondary=images_assoc)

の行を削除する必要がimageありますが、もちろん、restaurant_image_assoc最初にそのポイント内のすべての行を削除する必要があります。どうすればいいですか?

私はこれを試しました:

request.db.query(images_assoc)\
        .filter(images_assoc.c.image==image.id).delete()
request.db.delete(image)
request.db.commit()

image削除したい行はどこにありますが、次のエラーが発生します。

AttributeError: 'Table' object has no attribute 'class_'
4

2 に答える 2

0

問題は、SA がレストランとイメージの間の関係をイメージの側から追跡しないため、依存関係があることを「認識しない」ことです。反対側から関係を構成するとすぐに、関連付けテーブルのそれぞれの行も自動的に削除されます。関係の反対側を追加するには、単純に を使用するだけで十分ですbackref

class Restaurant(Base):
    images = relationship(Image, secondary=images_assoc, backref="restaurants")

ただし、各オブジェクトで明示的に定義することもできます (back_populatesこの場合は が必要です)。

class Image(Base):
    restaurants = relationship("Restaurant", secondary=images_assoc, back_populates="images")
class Restaurant(Base):
    images = relationship(Image, secondary=images_assoc, back_populates="restaurants")

しかし、後者は意味的には を使用するのと同じbackrefです。

于 2012-06-13T08:51:35.990 に答える
0

画像の行を削除すると、その画像 ID を取得する必要があります。次に、画像ID ==画像IDの関連テーブルで削除できます。

于 2012-06-12T21:36:05.413 に答える