这变化也忒快了吧。连问题的题目都变了
这是原题目的回答,多对多关系。
这是我设置的一个博客文章与tag多对多关系的模型,希望对你有所帮助。
class TagSpaces(db.Model):
"""多对多关系表"""
__tablename__ = 'tag_spaces'
tag_id = db.Column(db.Integer, db.ForeignKey('tags.id'), primary_key=True)
article_id = db.Column(db.Integer, db.ForeignKey('articles.id'), primary_key=True)
timestamp = db.Column(db.DateTime, default=datetime.utcnow)
class Tag(db.Model):
"""tag表"""
__tablename__ = 'tags'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True, index=True)
tagged = db.relationship('TagSpaces',
foreign_keys=[TagSpaces.tag_id],
backref=db.backref('tagged', lazy='joined'),
lazy='dynamic',
cascade='all, delete-orphan')
def __repr__(self):
return '' % self.name
class Article(db.Model):
"""article 表"""
__tablename__ = 'articles'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(64), index=True)
body = db.Column(db.Text)
......
......
......
tags = db.relationship('TagSpaces',
foreign_keys=[TagSpaces.article_id],
backref=db.backref('tags', lazy='joined'),
lazy='dynamic',
cascade='all, delete-orphan')
def tag(self, tag):
"""写文章的时候,直接往TagSpaces关联表里添加需要关联的 tag 标签"""
if not self.is_tagging(tag):
t = TagSpaces(tags=self, tagged=tag)
db.session.add(t)
def untag(self, tag):
"""从TagSpaces关联表里删除相关标签"""
f = self.tags.filter_by(tag_id=tag.id).first()
if f:
db.session.delete(f)
def is_tagging(self, tag):
"""判断相关标签是否与文章进行了关联"""
return self.tags.filter_by(tag_id=tag.id).first() is not None
@property
def taggeds(self):
"""以article类属性的形式,返回文章的tag标签实例"""
return Tag.query.join(TagSpaces, TagSpaces.tag_id == Tag.id).filter(TagSpaces.article_id == self.id)
article = Article.query.get(1) # 查询一篇文章,返回一个实例对象
print article.taggeds # 返回该篇文章关联的所有 tag 标签的实例对象。
for tag in article.taggeds:
print tag.name
# 循环返回所有的标签的名称