1

我有以下 ORM 类:

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

此外,我在 append 上关联了一个事件:

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 回答