sqlalchemy отношения многие ко многим, ссылающиеся на себя, сохраняют только одну сторону в таблице ассоциаций, другая - NULL - PullRequest
0 голосов
/ 11 марта 2020
relationship = db.Table(
    'parent_child', db.metadata,
    db.Column('parent_id', db.Integer, db.ForeignKey('category.id')),
    db.Column('child_id', db.Integer, db.ForeignKey('category.id'))
)

class Category(db.Model):
    __tablename__ = 'category'

    all_parents = db.relationship(
        'Category',
        secondary='relationship',
        foreign_keys=[relationship.columns.parent_id],
        )

    def on_create(category, parent_id, oldvalue, initiator):
        parent = Category.query.get(parent_id)
        if parent:
            category.all_parents.append(parent)


db.event.listen(Category.parent_id, 'set', Category.on_create)

db.session.add(category)
db.session.commit()

Я хочу многозначных отношений со ссылками, но код сохраняет только одну сторону в таблице ассоциаций, другая всегда равна NULL:

parent_id    | child_id
-----------------------
      95     |  NULL
-----------------------
      99     |  NULL
-----------------------
...

Я получил предупреждение в консоли:

SAWarning: Usage of the 'collection append' operation is not currently supported
 within the execution stage of the flush process. Results may not be consistent. 
Consider using alternative event listeners or connection-level operations instead.
  "event listeners or connection-level operations instead." % method

Поэтому я пытаюсь добавить родителя после коммита, он не работает:

db.session.add(category)
db.session.commit()

category.all_parents.append(category.parent)
db.session.add(category)
db.session.commit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...