我正在尝试通过构建一个简单的Wiki(很大程度上基于Flask-Admin示例)来学习Python/Flask/SQLAlchemy,但我正在努力理解如何从我的多对多关系中获取一个新列来显示.
我已经成功创建了Wiki并为标签创建了一个多对多的关系表而没有任何问题(并且标签在我看到的情况下正常工作),但是我想将标签显示为列而无法获取逻辑成功了.
目标:我想显示一个列,显示多对多关联表引用的标记.
这是我想要完成的图片:

以下是我认为的相关代码:
wiki_tags_table = db.Table('wiki_tags', db.Model.metadata,
db.Column('wiki_id', db.Integer, db.ForeignKey('wiki.id')),
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)
class Wiki(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), unique=True)
description = db.Column(db.Text)
path = db.Column(db.Unicode(256))
date_added = db.Column(db.DateTime)
tags_id = db.Column(db.Integer, db.ForeignKey('tag.id'))
tags = db.relationship('Tag', secondary=wiki_tags_table, backref=db.backref('wiki_tags_table', lazy='dynamic'))
def __unicode__(self):
return self.item
class WikiAdmin(sqla.ModelView):
column_exclude_list = ['path']
column_hide_backrefs = False
form_overrides = {
'path': form.FileUploadField
}
form_args = {
'path': {
'label': 'File',
'base_path': file_path
}
}
column_searchable_list = ('title', …Run Code Online (Sandbox Code Playgroud) 我创建了一个 Flask-SQLAlchemy API,其中包含项目与标签的多对多关系。
简单的添加没有任何问题(在适当的表中插入项目和标签),但如果我添加具有相同标签名称的另一个项目,它会创建一组重复的标签名称,而不是仅将关联表链接到现有标签条目。
我发现一些情况与我所要求的非常接近,但并不完全相同,我真的很努力地试图理解实现这一目标的最佳方法。
所以问题是:在标签表中仅包含唯一条目同时仍将标签与项目表正确关联的最佳方法是什么?
感谢您的任何帮助/指导!
这是我的模型:
items_tags = db.Table('items_tags',
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
db.Column('item_id', db.Integer, db.ForeignKey('item.id'))
)
class Item(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(80), unique=False)
code = db.Column(db.String(), unique=False)
notes = db.Column(db.String(), unique=False)
tags = db.relationship('Tag', secondary=items_tags, back_populates="items")
def json(self):
list_tag = []
for tag in self.tags:
list_tag.append({"tag": tag.name, "id": tag.id })
return json.loads(json.dumps({"id": self.id, "title": self.title, "code": self.code, "notes": self.notes, "tags" : list_tag }))
def …Run Code Online (Sandbox Code Playgroud)