adnanmuttaleb
adnanmuttaleb

Reputation: 3624

Add relation related columns to many-to-many table flask-sqlalchemy?

I have the following models:

class Page(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    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)

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)
    db.Column('language', db.String(50), nullable=False)
)

Know if I want to make the following additions:

tag = Tag()
Page.tags.append(tag)

How to set the value for the language column for the new added tag.

Upvotes: 1

Views: 82

Answers (1)

Qais Bsharat
Qais Bsharat

Reputation: 146

Yes, you can achieve that by creating PageTagModel model.

like the following:

class PageTagModel(db.Model):
    __tablename__ = 'pagetags'

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

    page = db.relationship('Page', backref=db.backref("pagetags"))
    tag = db.relationship('Tag', backref=db.backref("pagetags"))

    language = db.Column('language', db.String(50), nullable=False)

And please edit the Page model to the following:

class Page(db.Model):
    id = db.Column(db.Integer, primary_key=True) 

I assume you gave the Tag model table this tags by using __tablename__ = 'tags' and Page model to pages.

Full picture:

class Page(db.Model):
    __tablename__ = 'pages'
    id = db.Column(db.Integer, primary_key=True)

class Tag(db.Model):
    __tablename__ = 'tags'
    id = db.Column(db.Integer, primary_key=True)

class PageTagModel(db.Model):
    __tablename__ = 'pagetags'

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

    page = db.relationship('Page', backref=db.backref("tags_annotation"))
    tag = db.relationship('Tag', backref=db.backref("tags_annotation"))

    language = db.Column('language', db.String(50), nullable=False)

 # to use it
 tag = Tag()
 page = Page()
 page_tags = PageTagModel(page=page, tag=tag, language='English')

 db.session.add(tag)
 db.session.add(page)
 db.session.add(page_tags)
 db.session.commit()

if you want to get tags directly from the Page model then you must add the following line to the Page model

tags = db.relationship('Tag', secondary='pagetags', lazy='subquery', backref=db.backref('pages', lazy=True))

Upvotes: 1

Related Questions