Issue rendering a List Object: AttributeError: 'list' object has no attribute '...'
Issue rendering a List Object: AttributeError: 'list' object has no attribute '...'
我正在尝试通过 return {'category_name': category.category_name}
在 views.py 文件中呈现好的 ol' JSON。我正在使用金字塔网络框架。我在 SQLALCHEMY 数据库中使用自定义 RESTful web api 和 CRUD 设计。
出于某种原因,我一直收到 Traceback error
:
views/views.py", line 112, in get_category
return {'category': category.category_name}
AttributeError: 'list' object has no attribute 'category_name'
我只想将其打印到 HTML 或将其渲染到 HTML,以便我可以看到创建的内容。类别确实具有属性 category_name...这令人困惑。也许要 return 一个列表值,我必须使用特殊的语法?我在网上找不到任何对我有意义的东西(这是 most relevant),但非常感谢任何指导!我相信这很简单。
GET 方法:return 对象的站点(旨在稍后在 Jinja2 模板上呈现):
@view_config(route_name='category', request_method='GET', renderer='json')
def get_category(request):
with transaction.manager:
category_id = int(request.matchdict['id'])
category = api.retrieve_category(category_id)
if category is None:
raise HTTPNotFound()
return {'category_name': category.category_name}
这就是 POST 方法的样子(非常像数据库 api 中的 Create 函数):
@view_config(route_name='categories', request_method='POST', renderer='json')
def post_category(request):
with transaction.manager:
category_name = request.params['category_name']
category = api.create_category(category_name)
return HTTPCreated(location=request.route_url('category',id=id))
DB API 用于创建类别(这与评估具有多对多关系,因此列表):
def create_category(self, category_name):
new_category = Category(category_name)
self.session.add(new_category)
print(new_category)
self.session.commit()
检索方法:
def retrieve_category(self, something_unique):
if isinstance(something_unique, int):
return self.session.query(Category).\
filter(Category.category_id == something_unique).all() # multiple categories
elif isinstance(something_unique, basestring):
print(something_unique) # added
return self.session.query(Category).\
filter(Category.category_name == something_unique).one()
print(something_unique)
if NoResultFound:
raise NotFoundError('No results found')
elif MultipleResultsFound:
raise MultipleResultsFound('Too many results found')
elif isinstance(something_unique, Category):
return something_unique
else:
raise ValueError('Value being passed is an object')
便利api(继承):
def create_assessment(self, name, text, username, videoname, category_names):
user = self.retrieve_user(username)
video = self.retrieve_video(videoname)
cat_objects = [self.retrieve_category(category_name) for category_name in category_names]
return super(ConvenienceAPI, self).create_assessment(name, text, user, video, cat_objects)
api.retrieve_category()
是 returning 列表,如异常所示。您对 return 有何期待?
您需要检查您的 API 是什么 returning。也许您可以访问 returned 列表中的第一项,因此这可能有效:
return {'category_name': category[0].category_name}
但是,如果 API 实际上是 return 一个空列表 ([]
) 表示没有结果,那么您需要检查它而不是 None
:
if not category:
raise HTTPNotFound()
我正在尝试通过 return {'category_name': category.category_name}
在 views.py 文件中呈现好的 ol' JSON。我正在使用金字塔网络框架。我在 SQLALCHEMY 数据库中使用自定义 RESTful web api 和 CRUD 设计。
出于某种原因,我一直收到 Traceback error
:
views/views.py", line 112, in get_category
return {'category': category.category_name}
AttributeError: 'list' object has no attribute 'category_name'
我只想将其打印到 HTML 或将其渲染到 HTML,以便我可以看到创建的内容。类别确实具有属性 category_name...这令人困惑。也许要 return 一个列表值,我必须使用特殊的语法?我在网上找不到任何对我有意义的东西(这是 most relevant),但非常感谢任何指导!我相信这很简单。
GET 方法:return 对象的站点(旨在稍后在 Jinja2 模板上呈现):
@view_config(route_name='category', request_method='GET', renderer='json')
def get_category(request):
with transaction.manager:
category_id = int(request.matchdict['id'])
category = api.retrieve_category(category_id)
if category is None:
raise HTTPNotFound()
return {'category_name': category.category_name}
这就是 POST 方法的样子(非常像数据库 api 中的 Create 函数):
@view_config(route_name='categories', request_method='POST', renderer='json')
def post_category(request):
with transaction.manager:
category_name = request.params['category_name']
category = api.create_category(category_name)
return HTTPCreated(location=request.route_url('category',id=id))
DB API 用于创建类别(这与评估具有多对多关系,因此列表):
def create_category(self, category_name):
new_category = Category(category_name)
self.session.add(new_category)
print(new_category)
self.session.commit()
检索方法:
def retrieve_category(self, something_unique):
if isinstance(something_unique, int):
return self.session.query(Category).\
filter(Category.category_id == something_unique).all() # multiple categories
elif isinstance(something_unique, basestring):
print(something_unique) # added
return self.session.query(Category).\
filter(Category.category_name == something_unique).one()
print(something_unique)
if NoResultFound:
raise NotFoundError('No results found')
elif MultipleResultsFound:
raise MultipleResultsFound('Too many results found')
elif isinstance(something_unique, Category):
return something_unique
else:
raise ValueError('Value being passed is an object')
便利api(继承):
def create_assessment(self, name, text, username, videoname, category_names):
user = self.retrieve_user(username)
video = self.retrieve_video(videoname)
cat_objects = [self.retrieve_category(category_name) for category_name in category_names]
return super(ConvenienceAPI, self).create_assessment(name, text, user, video, cat_objects)
api.retrieve_category()
是 returning 列表,如异常所示。您对 return 有何期待?
您需要检查您的 API 是什么 returning。也许您可以访问 returned 列表中的第一项,因此这可能有效:
return {'category_name': category[0].category_name}
但是,如果 API 实际上是 return 一个空列表 ([]
) 表示没有结果,那么您需要检查它而不是 None
:
if not category:
raise HTTPNotFound()