2

我与同一张表有两个关系。当我向一个关系添加元素时,在我提交会话之前,这不会反映到另一个关系。有没有办法强制“更新”关系?

具体例子:

class Event(ManagerBase):
    """Defines an event."""

    __tablename__ = 'eventing_events'

    id = Column(Integer, primary_key=True)
    device_id = Column(Integer, ForeignKey(EventingDevice.id), nullable=False)
    device = relation(EventingDevice)
    type_id = Column(Integer, ForeignKey(EventType.id), nullable=False)
    type = relation(EventType)
    datetime = Column(DateTime, nullable=False)
    summary = Column(String(500))

    fields = relation("EventFieldValue",
                      viewonly=True,
                      collection_class=attribute_mapped_collection("field.name"))

class EventFieldValue(ManagerBase):
    """The value of a single field of an event."""

    __tablename__ = 'eventing_event_field_values'

    event_id = Column(Integer, ForeignKey(Event.id), primary_key=True)
    event = relation(Event, backref=backref("field_values",
                                            collection_class=attribute_mapped_collection("field")))
    field_id = Column(Integer, ForeignKey(Field.id), primary_key=True)
    field = relation(Field)
    value = Column(Text)

我有两个从Eventto EventFieldValue:fieldsfield_values(通过事件的 backref)的实现。当我将 EventFieldValue 添加到 时,它在我提交会话之前event.field_values不会反映。event.fields

4

2 回答 2

2

因为您有两个关系,sqlalchemy 必须为每个关系发出请求,并且不会在会话中共享它们的缓存。

你应该看看Association proxies,这似乎正是你所需要的。它们允许您只定义一个关系并将代理放在它们的顶部,以便更轻松地访问关系中的内容。

于 2012-06-26T13:38:59.280 回答
0

刷新会话应该可以解决这个问题。它使用所有新状态更新您的会话,但不执行提交。您还可以查看刷新/过期,这将重新加载您的对象。

于 2012-06-26T13:38:18.683 回答