python - flask-SQLAlchemy怎么添加多对多数据
伊谢尔伦
伊谢尔伦 2017-04-17 13:19:24
[Python讨论组]

我按照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
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(6)
迷茫
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()

天蓬老师

楼上们这都是什么诡异的做法啊,。。。。
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)

ringa_lee

page = Page()
tag1 = Tag()
page.tags.append(tag1...)#有没有extend我忘记了

大家讲道理

lz不是在问怎么做多对多,而是问多对多怎么插入吧,看这个

http://docs.sqlalchemy.org/en/rel_0_9/orm/tutorial.html#orm-tutorial-many-to-many

里面有例子。。我感觉写入很简单,你把tags当成一个list就好了

巴扎黑

没明白题主这个多对多是什么意思,看代码题主的意图是想添加一个page,然后给page加上tag。按照贴出来的代码,题主认为一个page只能对应一个tag。题主是想要下图这样的吗?一个问题对应多个标签?或者多个问题对应一个标签?

其实,tags可以设为string类型,然后添加多个tag.id并以逗号分隔开。
显示标签的时候读出这条tags,再用split(',')方法转为[],然后遍历就可以了。

PHP中文网

还是感觉操作数据库太麻烦了.

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号