附加到association_proxy不会发出事件:

时间:2013-01-17 15:57:01

标签: sqlalchemy

我有以下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事件到底层属性。

谢谢, Jacco

1 个答案:

答案 0 :(得分: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

所以你需要改变这个测试用例,看起来更像你的代码,看看有什么区别。