我有以下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
答案 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
所以你需要改变这个测试用例,看起来更像你的代码,看看有什么区别。