python - 如何在 Flask/SQLAlchemy 中显示包含多对多查询结果的列

标签 python flask flask-sqlalchemy flask-admin

我正在尝试通过构建一个简单的 Wiki(主要基于 a Flask-Admin example)来学习 Python/Flask/SQLAlchemy,但我正在努力了解如何从我的多对多关系中获取一个新专栏来显示。

我已经成功地创建了 Wiki 并为标签创建了一个多对多的关系表,没有任何问题(据我所知,标签工作正常),但我想将标签显示为一列并且可以弄清楚逻辑。

目标:我想显示一列,显示多对多关联表引用的标签。

这是一张我想要完成的图片:

A table with a column named Tag(s) with two rows.  Row #1 contains the text "Tag 1, Tag 4". Row #2 contains the text "Tag 4, Tag 5".

这是我认为相关的代码:

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', 'description', 'path')

    def __init__(self, session):
        super(WikiAdmin, self).__init__(Wiki, session)

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode(64))

    def __unicode__(self):
        return self.name

我一直在引用这些文档(主要是尝试 backref 的变体)但还没有弄明白:

最佳答案

不确定这是否有帮助,因为我正在学习自己。但我有一个类似的问题,我想显示“外键表”中的一列,并这样做:

我的模型.py

  from app import db

class Member(db.Model):
    __tablename__ = 'members'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(64), index=True)
    phone = db.Column(db.String(10), index=True)
    email = db.Column(db.String(120), index=True, unique=True)
    grade = db.relationship('Grade', backref='member')
    attendance = db.relationship('Attendance', backref='member')

    def __repr__(self):
        return '<User %r>' % self.name


class Grade(db.Model):
    __tablename__ = 'grades'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    member_id = db.Column(db.Integer, db.ForeignKey('members.id'))
    grade = db.Column(db.String(10))
    grade_date = db.Column(db.Date)

    def __repr__(self):
        return '<Grading %r>' % self.id

    def __str__(self):
        return self.grade

    def __unicode__(self):
        return self.grade


class Attendance(db.Model):
    __tablename__ = 'attendance'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    id_member = db.Column(db.Integer, db.ForeignKey('members.id'))
    attend_date = db.Column(db.Date)

    def __repr__(self):
        return '<Attenance %r>' % self.id

我的观点.py

from app.models import Member, Grade, Attendance
from app import app, admin, db
from flask_admin import BaseView, expose
from flask_admin.contrib.fileadmin import FileAdmin
from flask_admin.contrib.sqla import ModelView
import os.path as op


class AdminView(ModelView):
    column_display_pk = True  # optional, but I like to see the IDs in the list
    column_hide_backrefs = False
    # column_list = ('id', 'name', 'parent')
    create_modal = True
    edit_modal = True


class MemberAdmin(ModelView):
    column_display_pk = True  # optional, but I like to see the IDs in the list
    column_hide_backrefs = False
    can_view_details = True
    create_modal = True
    edit_modal = True
    form_columns = ['name', 'phone', 'email', 'grade', 'attendance']
    column_details_list = ['name', 'phone', 'email', 'grade', 'attendance']
    column_searchable_list = ['name', 'email']
    column_list = ('id', 'name', 'phone','email','grade')


class GradeAdmin(ModelView):
    column_display_pk = True  # optional, but I like to see the IDs in the list
    column_hide_backrefs = False
    column_list = ('id', 'member', 'grade', 'grade_date')
    form_choices = {'grade': [('Beginner', 'Beginner'), ('Yellow', 'Yellow'), ('Orange', 'Orange'),
                              ('Green 1', 'Green 1'), ('Green 2', 'Green 2'), ('Blue 1', 'Blue 1'),
                              ('Blue 2', 'Blue 2'), ('Purple 1', 'Purple 1'), ('Purple 2', 'Purple 2'),
                              ('Brown 1', 'Brown 1'), ('Brown 2', 'Brown 2'), ('Red 1', 'Red 1')]}


admin.add_view(MemberAdmin(Member, db.session, endpoint='member', category='Admin'))
admin.add_view(GradeAdmin(Grade, db.session, endpoint='grades', category='Admin'))
admin.add_view(ModelView(Attendance, db.session, endpoint='attendance', category='Admin'))

因为我真的不知道我在做什么(还)我认为让我看到我的 Member 模型的列以及添加的来自 Grade 模型的额外列的是 MemberAdmin 类中的这些行(模型 View ):

column_hide_backrefs = False
can_view_details = True
...
form_columns = ['name', 'phone', 'email', 'grade', 'attendance']

关于python - 如何在 Flask/SQLAlchemy 中显示包含多对多查询结果的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24645459/

相关文章:

python - 在Python中组合字典中列表的所有排列

python - Numpy 无法正确恢复维度(tofile 和 fromfile 调用)

python - Flask 应用程序中的自定义路由

python - SQLAlchemy delete() 函数刷新,但不提交,即使在调用 commit() 之后

python 对 Flask-SQLAlchemy 中 AppenderBaseQuery 属性的赋值无效

Python SQLAlchemy 如何通过排除选定列进行查询

python - 如何修复 : 'TypeError: expected string or bytes-like object' when doing unit test on a views. py 函数

python - 通过SOCKS5代理连接SSH服务器

javascript - 使用 python flask 时,浏览器同步不会刷新浏览器

python - 如何使用sqlalchemy获取在sqlite中创建的数据库的sql转储