📜  flask admin forgeign 键显示文字 - Python (1)

📅  最后修改于: 2023-12-03 15:00:46.701000             🧑  作者: Mango

Flask Admin: 使用外键显示文字

在Flask应用程序中使用Flask-Admin时,您可能需要在列表视图中显示表格之间的关系,其中一个表格使用外键引用另一个表格。默认情况下,Flask-Admin仅显示外键的ID,而不是引用表格中的文本或其他值。幸运的是,您可以执行简单的操作来确保Flask-Admin使用外键显示文本。

在模型中定义关系

在定义模型时,您可以使用SQLAlchemy的relationship()方法来定义多个表格之间的关系。例如,如果您有一个Author表和一个Book表,并且每个作者可以编写多本书,则可以使用以下代码定义关系:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Author(db.Model):
    __tablename__ = 'authors'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)

class Book(db.Model):
    __tablename__ = 'books'

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(120), nullable=False)
    author_id = db.Column(db.Integer, db.ForeignKey('authors.id'), nullable=False)

    author = db.relationship('Author', backref=db.backref('books', lazy=True))

在上面的代码中,我们定义了一个Author类和一个Book类,并且在Book类中使用了author_id外键引用了Author表。使用relationship()方法和backref属性,我们定义了一个books属性,可用于访问与Author实例相关联的所有Book实例。

在Flask-Admin中使用关系

接下来,我们需要在Flask-Admin中使用关系。为此,我们需要在ModelView派生类中定义一个column_formatters字典。该字典应该是column_name: callable键值对的集合,其中column_name是要自定义的列的名称,而callable是一个可以将单元格的值转换为自定义格式的函数。

在我们的例子中,我们将使用author_id外键名称。如果我们创建一个名为BookModelViewModelView派生类,则可以在其中添加以下内容:

from flask_admin.contrib.sqla import ModelView

class BookModelView(ModelView):
    column_formatters = {
        'author_id': lambda v, c, m, p: m.author.name
    }

在上面的代码中,我们以author_id为键,定义一个lambda函数,该函数将单元格的值m.author.name从模型中返回Author的名称而不是ID。

使用Flask-Admin注册模型视图

最后,我们需要使用Flask-Admin将BookModelView注册为Book模型的视图。为此,我们只需要将以下行添加到应用程序的app.pymodels.py中:

from flask_admin import Admin

admin = Admin(app, name='My App')

admin.add_view(BookModelView(Book, db.session))

现在,当您在Flask-Admin中查看Book模型的列表视图时,它将显示您定义的每个列的自定义格式,包括使用外键显示文本的列。

结论

Flask-Admin是一个非常强大的工具,可用于自动生成管理后台。在本教程中,我们学习了如何在Flask-Admin中使用外键显示文本。使用这种方法,您可以轻松地访问和使用一个或多个表之间的关系。