1

次のORMクラスがあります。

class Video(Base):
    ...
    public_tag_entries = relationship("VideoTagEntry")
    tags = association_proxy("public_tag_entries", "value")

さらに、追加時にイベントを関連付けました:

def video_tag_added(target, value, initiator):
    print "tag added"

event.listen(Video.public_tag_entries, 'append', video_tag_added)

public_tag_entries に追加すると、イベントが発行されます

video.public_tag_entries.append(VideoTagEntry(value = "foo"))

ただし、次を使用して追加すると:

video.tags.append("foo")

イベントは発行されません。

video.tags アソシエーション プロキシにイベントを登録しようとしましたが、うまくいかないようです。

質問: これは予期された正しい動作ですか、それともバグですか? 回避策はありますか、それとも単に間違ったことをしていますか。

アソシエーション プロキシが、基になる属性に対して orm イベントをトリガーすることを期待します。

ありがとう、ジャッコ

4

1 に答える 1

1

再現できません(0.7.9を使用):

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import event


Base = declarative_base()

class VideoTagEntry(Base):
    __tablename__ = 'vte'
    id = Column(Integer, primary_key=True)
    video_id = Column(Integer, ForeignKey('video.id'))
    value = Column(String)

    def __init__(self, value):
        self.value = value

class Video(Base):
    __tablename__ = 'video'
    id = Column(Integer, primary_key=True)

    public_tag_entries = relationship("VideoTagEntry")
    tags = association_proxy("public_tag_entries", "value")

canary = []
def video_tag_added(target, value, initiator):
    print "tag added"
    canary.append(value)

event.listen(Video.public_tag_entries, 'append', video_tag_added)

video = Video()

video.public_tag_entries.append(VideoTagEntry(value="foo"))

video.tags.append("foo")

assert len(canary) == 2

出力:

tag added
tag added

したがって、このテストケースをコードのように変更して、違いを確認する必要があります。

于 2013-01-18T17:52:08.533 に答える