在Flask Admin中创建Flask-SQLAlchemy的Brand模型时触发AttributeError
问题:Flask Admin创建Brand模型时触发AttributeError: 'tuple' object has no attribute 'items'
在Flask-SQLAlchemy中定义了Product和Brand两个关联模型,尝试在Flask Admin中创建Brand时,触发以下错误,无法完成创建:
AttributeError: 'tuple' object has no attribute 'items'
相关代码如下:
from flask import Flask from flask_sqlalchemy import SQLAlchemy from datetime import datetime from flask_admin import Admin from flask_admin.contrib.sqla import ModelView app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://postgres:postgres@localhost:5432/ecommerce' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SECRET_KEY'] = 'secret' db = SQLAlchemy(app) # Models class Brand(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False, unique=True) products = db.relationship('Product', backref='brand', lazy=True) def __str__(self): return self.name def format_products(view, context, model, name): return ', '.join([product.name for product in model.products]) class BrandView(ModelView): column_list = ['name', 'products'] column_formatters = {'products': format_products} form_excluded_columns = ['products'] - class Product(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(200), nullable=False) description = db.Column(db.Text) price = db.Column(db.Float, nullable=False) brand_id = db.Column(db.Integer, db.ForeignKey('brand.id'), nullable=False) with app.app_context(): db.create_all() admin = Admin(app) admin.add_view(ModelView(Product, db.session)) admin.add_view(BrandView(Brand, db.session)) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()
错误原因
代码中BrandView类定义结束后,存在一个多余的-符号,这个符号破坏了Python代码的结构解析逻辑,导致后续Product类的定义被错误解析,最终在Flask Admin初始化模型视图时触发了元组相关的属性错误。
修复方案
移除BrandView类和Product类之间的多余-符号,确保代码结构合法。
修复后的完整代码:
from flask import Flask from flask_sqlalchemy import SQLAlchemy from datetime import datetime from flask_admin import Admin from flask_admin.contrib.sqla import ModelView app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://postgres:postgres@localhost:5432/ecommerce' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SECRET_KEY'] = 'secret' db = SQLAlchemy(app) # Models class Brand(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False, unique=True) products = db.relationship('Product', backref='brand', lazy=True) def __str__(self): return self.name def format_products(view, context, model, name): return ', '.join([product.name for product in model.products]) class BrandView(ModelView): column_list = ['name', 'products'] column_formatters = {'products': format_products} form_excluded_columns = ['products'] class Product(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(200), nullable=False) description = db.Column(db.Text) price = db.Column(db.Float, nullable=False) brand_id = db.Column(db.Integer, db.ForeignKey('brand.id'), nullable=False) with app.app_context(): db.create_all() admin = Admin(app) admin.add_view(ModelView(Product, db.session)) admin.add_view(BrandView(Brand, db.session)) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()
内容的提问来源于stack exchange,提问作者Kashif Raza Khan
相关产品推荐
相关产品推荐

