You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:00:11