sqlalchemy在删除之前更新另一个模型

时间:2012-06-12 03:20:59

标签: python sqlalchemy

我正在使用sqlalchemy和postgresql。我是sqlalchemy的新手。

我为名为“to_user_id”的模型“User”制作了forien键以模拟“邀请”,并且该键不可为空。

当我尝试使用

删除模型“User”的实例时
session.delete(user)

并且sqlalchemy在删除之前自动将邀请函的to_user_id设置为NULL,并且postgresql会在出现错误之后自动将其设置为NULL。

IntegrityError: (IntegrityError) null value in column "to_user_id" violates not-null constraint

如何禁用它?

这是我模型的定义

class User(Base):
    '''
    User model
    '''
    __tablename__='User'
    id = Column(Integer,primary_key=True)

class Invitation(Base):
    '''
    Invitation model
    '''
    __tablename__ = 'Invitation'
    __table_args__ = (UniqueConstraint('appointment_id', 'to_user_id'),)
    id = Column(Integer, primary_key=True)

    appointment_id = Column(Integer,ForeignKey('Appointment.id',
        ondelete='CASCADE'), nullable=False)
    appointment = relationship('Appointment', backref=backref('invitations'),
    )

    from_user_id = Column(Integer,ForeignKey('User.id',
        ondelete='SET NULL'), nullable=True)
    from_user = relationship('User', backref=backref('sent_invitations'),
        primaryjoin='Invitation.from_user_id==User.id')

    to_user_id = Column(Integer,ForeignKey('User.id',
        ondelete='CASCADE'), nullable=False)
    to_user = relationship('User',backref=backref('received_invitations'),
        primaryjoin='Invitation.to_user_id==User.id',
    )

1 个答案:

答案 0 :(得分:3)

您应该将cascade='delete'传递给to_user relationship()See the docs here

ondelete的{​​{1}}参数会影响DDL语句的生成,而不会影响ORM的行为。