📅  最后修改于: 2023-12-03 15:00:46.701000             🧑  作者: Mango
在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中使用关系。为此,我们需要在ModelView
派生类中定义一个column_formatters
字典。该字典应该是column_name: callable
键值对的集合,其中column_name
是要自定义的列的名称,而callable
是一个可以将单元格的值转换为自定义格式的函数。
在我们的例子中,我们将使用author_id
外键名称。如果我们创建一个名为BookModelView
的ModelView
派生类,则可以在其中添加以下内容:
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将BookModelView
注册为Book
模型的视图。为此,我们只需要将以下行添加到应用程序的app.py
或models.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中使用外键显示文本。使用这种方法,您可以轻松地访问和使用一个或多个表之间的关系。