Flask Many to Many проходит через id для вставки данных в таблицу, не работает - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь добавить данные в таблицу

>>> paper = ['1', '2']
>>> work = Work(name="Sample", cost="500")
>>> db.session.add(work)
>>> for pape1 in paper:
>>>     paper1 = Paper.query.filter_by(id=pape1).first()
>>>     paper1.pages.append(work)
>>>     db.session.add(paper1)
>>>     db.session.commit()

models.py

papers = db.Table('papers',
    db.Column('work_id', db.Integer, db.ForeignKey('work.id'), primary_key=True),
    db.Column('paper_id', db.Integer, db.ForeignKey('paper.id'), primary_key=True)
)

class Work(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(90), nullable=False)
    page = db.relationship('Paper', secondary=papers, lazy='subquery',
        backref=db.backref('pages', lazy=True), uselist=False)
    cost = db.Column(db.Integer)

class Paper(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(90), nullable=False)

Я думаю, что я должен получить что-то вроде этого.

  work_id  |  paper_id
  ---------|-----------
1 1        | 1          
  ---------|-----------
2 1        | 2

Но я получаю это.таблица документов

рисунок 1.

  work_id  |  paper_id
  ---------|-----------
1 1        | 2          
  ---------------------

Бумага с id = 2 однажды связывается с работой с id = 1.Но когда я начал отлаживать.Я видел, что после первого цикла это добавляет к таблице документов.Вот так.

рисунок 2.

  work_id  |  paper_id
  ---------|-----------
1 1        | 1        
  ---------------------

Но после второго цикла я думаю, что он обновляет его с рисунка 2 до рисунка 1. Я не знаючто я делаю не так?

1 Ответ

0 голосов
/ 23 октября 2018

Вы установили uselist на False. Не делайте этого , вы сказали SQLAlchemy, что атрибут page должен представлять собой скаляр , отдельный элемент:

page = db.relationship('Paper', secondary=papers, lazy='subquery',
    backref=db.backref('pages', lazy=True), uselist=False)

Из relationship документация для uselist:

логическое значение, указывающее, следует ли загружать это свойство в виде списка или скаляра.В большинстве случаев это значение определяется автоматически relationship() во время конфигурации преобразователя, основываясь на типе и направлении взаимосвязи - один ко многим образует список, многие к одному образует скаляр, многие ко многим - это список.Если требуется скаляр, где обычно присутствует список, такой как двунаправленное отношение один к одному, установите uselist в False.

Вы хотите Не устанавливайте атрибут и оставьте его для SQLAlchemy, чтобы определить, каким он должен быть.Для отношений «многие ко многим» вы действительно хотите, чтобы оно было True, и это автоматический результат, когда вы его опускаете:

page = db.relationship('Paper', secondary=papers, lazy='subquery',
    backref=db.backref('pages', lazy=True))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...