SQLAlchemy: таблица отношений с составным первичным ключом

У меня есть набор таблиц, которые выглядят так:

<code>workflows = Table('workflows', Base.metadata,
                  Column('id', Integer, primary_key=True),
                 )

actions = Table('actions', Base.metadata,
                Column('name', String, primary_key=True),
                Column('workflow_id', Integer, ForeignKey(workflows.c.id), primary_key=True),
               )

action_dependencies = Table('action_dependencies', Base.metadata,
                            Column('workflow_id', Integer, ForeignKey(workflows.c.id), primary_key=True),
                            Column('parent_action', String, ForeignKey(actions.c.name), primary_key=True),
                            Column('child_action', String, ForeignKey(actions.c.name), primary_key=True),
                           )
</code>

Мои классы ORM выглядят так:

<code>class Workflow(Base):
    __table__ = workflows

    actions = relationship("Action", order_by="Action.name", backref="workflow")


class Action(Base):
    __table__ = actions

    children = relationship("Action",
                            secondary=action_dependencies,
                            primaryjoin=actions.c.name == action_dependencies.c.parent_action,
                            secondaryjoin=actions.c.name == action_dependencies.c.child_action,
                            backref="parents"
                           )
</code>

Так что в моей системе каждое действие уникально идентифицируется комбинацией идентификатора рабочего процесса и его имени. Мне бы хотелось, чтобы каждое действие имелоparents а такжеchildren атрибут, который ссылается на родительские и дочерние действия. Каждое действие может иметь несколько родителей и детей.

Проблема возникает, когда у меня есть такая функция, как:

<code>def set_parents(session, workflow_id, action_name, parents):
    action = session.query(db.Action).filter(db.Action.workflow_id == workflow.id).filter(db.Action.name == action_name).one()

    for parent_name in parents:
        parent = session.query(db.Action).filter(db.Action.workflow_id == workflow.id).filter(db.Action.name == parent_name).one()
        action.parents.append(parent)

    session.commit()
</code>

Я получаю ошибку как:

<code>IntegrityError: (IntegrityError) action_dependencies.workflow_id may not be NULL u'INSERT INTO action_dependencies (parent_action, child_action) VALUES (?, ?)' (u'directory_creator', u'packing')
</code>

Как мне получить отношения для правильной установки workflow_id?

Ответы на вопрос(2)

Ваш ответ на вопрос