Как использовать Flask -SQLAlchemy с моделью «многие ко многим»? - PullRequest
0 голосов
/ 08 января 2020

Я хочу создать отношение многие ко многим, используя Flask -SQLAlchemy, но опускаюсь даже на самый простой пример. Я использовал пример кода по ссылке здесь и добавил основные элементы, чтобы получить этот функционал в вызове файла app.py:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)


    tags = db.Table('tags',
        db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True),
        db.Column('page_id', db.Integer, db.ForeignKey('page.id'), primary_key=True)
    )

class Page(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    page_name = db.Column(db.String(30))
    tags = db.relationship('Tag', secondary=tags, lazy='subquery',
        backref=db.backref('pages', lazy=True))

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    tag_name = db.Column(db.String(30))

У меня есть команда Python набранная строка:

from app import * 
db.create_all()

Который правильно создал файл, и я вижу три таблицы. Отлично!

Как мне теперь go о создании страниц и тегов в этом примере ... Я ожидал что-то вроде:

new_page = Page(tags=["tagone"])

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

AttributeError: у объекта 'str' нет атрибута '_sa_instance_state

Я не уверен, с чего начать, чтобы быть честным ..

1 Ответ

0 голосов
/ 08 января 2020

Я разобрался с поиском и тестированием. Я не уверен, что это лучшая практика, но она работает:

 new_page_too = Page(page_name='Johnny New')
 new_tag = Tag(tag_name='Solved')
 new_tag_too = Tag(tag_name='Fixed It!')
 new_page_too.tags.append(new_tag)
 new_page_too.tags.append(new_tag_too)
 db.session.add(new_page_too)
 db.session.commit()

Очень приятно, и я люблю SQLAlchemy: -)

Также благодаря комментарию вы также можете сделать это:

new_page = Page(page_name='Johnny Third', tags=[Tag(tag_name='Tag1Test'), Tag(tag_name='Tag2Test')])
...