flask-SQLAlchemy怎么添加多对多数据
我按照 https://pythonhosted.org/Flask-SQLAlchemy/index.html 的提示,创建两个表,如下,该怎么写入数据呢?
tags = db.Table('tags',
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
db.Column('page_id', db.Integer, db.ForeignKey('page.id'))
)
class Page(db.Model):
#文章对象,标签是多对多
__tablename__ = 'page'
id = db.Column(db.Integer, primary_key=True)
tags = db.relationship('Tag', secondary=tags,
backref=db.backref('pages', lazy='dynamic'))
title = db.Column(db.String(200), unique=True)
date = db.Column(db.DateTime)
page = db.Column(db.String(20000))
def __init__(self, title, date, page):
self.title = title
self.date = date
self.page = page
def __repr__(self):
return '<Page %r>' % self.title
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), unique=True)
def __init__(self, name):
self.name = name
def __repr__(self):
return '<Tag: %r>' % self.name
无毁之湖光
10 years, 4 months ago
Answers
lz不是在问怎么做多对多,而是问多对多怎么插入吧,看这个
http://docs.sqlalchemy.org/en/rel_0_9/orm/tutorial.html#orm-tutorial-many-to-many
里面有例子。。我感觉写入很简单,你把tags当成一个list就好了
ohmybi
answered 10 years, 4 months ago
楼上们这都是什么诡异的做法啊,。。。。
flask-admin有一个实例刚好做到了
https://github.com/mrjoes/flask-admin/blob/master/examples/sqla/simple.py
表定义:
post_tags_table = db.Table('post_tags', db.Model.metadata,
db.Column('post_id', db.Integer, db.ForeignKey('post.id')),
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
#省略
tags = db.relationship('Tag', secondary=post_tags_table)
def __unicode__(self):
return self.title
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Unicode(64))
def __unicode__(self):
return self.name
咳,原来楼主问的是怎么添加,刚好这个实例下面一点也有:
#创建标签
tag_list = []
for tmp in ["YELLOW", "WHITE", "BLUE", "GREEN", "RED", "BLACK", "BROWN", "PURPLE", "ORANGE"]:
tag = Tag()
tag.name = tmp
tag_list.append(tag)
db.session.add(tag)
#创建
post = Post()
post.tags = random.sample(tag_list, 2) # select a couple of tags at random
db.session.add(post)
阿姆罗夏亚
answered 10 years, 4 months ago
def gen_tags():
''' 生成一个 Tag 对象组成的列表'''
tags_list = []
for i in list(range(10)):
tag_name = "tag_" + str(i)
tag = Tag(name=tag_name)
tags_list.append(tag)
return tags_list
def gen_pages(count=10):
''' 生成一个 Page 对象组成的列表,每个 Page 对象,都有 X 个 tags,来自上面 gen_tags 生成的列表。 '''
pages_list = []
tags = gen_tags()
for i in list(range(10)):
title = page = "page" + str(i)
page_obj = Page(title=title, page=page, date=datetime.utcnow())
page_obj.tags = tags # 将 gen_tags 生成的 Tag 对象们添加进去。
pages_list.append(page_obj)
return pages_list
pages = gen_pages() # 生成的 Page 对象列表。
db.session.add_all(pages) # 一次性添加所有 Page。
db.session.commit() # 提交到数据库
# 测试
import random
obj_id = random.choice(list(range(10)))
tag_name = "tag_" + str(obj_id)
tag = Tag.query.filter_by(name=tag_name).first()
print("tag.pages.all(): ", tag.pages.all())
page_title = "page_" + str(obj_id)
page = Page.query.filter_by(title=page_title).first()
print("page.tags", page.tags)
new_tag_name = ''.join(random.choice(chars) for _ in list(range(10)))
tag_obj = Tag(new_tag_name) # 或者查询出来的某个 Tag 实例。
page.tags.append(tag_obj) # 为 page 增加一个 Tag。
db.session.commit()
Ducks
answered 10 years, 4 months ago