【问题标题】:Issue rendering a List Object: AttributeError: 'list' object has no attribute '...'渲染列表对象的问题:AttributeError:“列表”对象没有属性“...”
【发布时间】:2015-12-21 14:47:22
【问题描述】:

我正在尝试通过 return {'category_name': category.category_name}在 views.py 文件中呈现良好的 JSON。我正在使用 Pyramid Web 框架。我在 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 ......这令人困惑。也许要返回一个列表值,我必须使用特殊的语法?我在网上找不到任何对我有意义的东西(这是most relevant),但任何指导都将不胜感激!我相信这很简单。

GET 方法:返回对象的站点(打算稍后在 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 方法的样子(很像 DB 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)

【问题讨论】:

  • 错误显然是在说category 是一个列表。请发布创建category的代码。
  • POST(创建)类别代码如上。我现在将添加数据库的 API。
  • 请添加api.retrieve_category的代码。
  • 看起来api.retrieve_category 返回一个可能为空的list,而不是预期的对象或None
  • @DanD。是的,它确实返回了一个列表。这就是我想要打印的。在 JSON 返回值中打印/呈现列表的语法是什么?一定有办法吧?

标签: python json rest pyramid traceback


【解决方案1】:

api.retrieve_category() 正在返回一个列表,如异常所示。你期望它返回什么?

您需要检查您的 API 返回的内容。可能您可以访问返回列表中的第一项,这样可能会起作用:

return {'category_name': category[0].category_name}

但是,如果 API 实际上返回一个空列表 ([]) 表示没有结果,那么您需要检查它而不是 None

if not category:
    raise HTTPNotFound()

【讨论】:

  • 它有效!谢谢你。我知道这是问题所在,我只是不知道在 JSON 返回值中打印列表的正确语法。我对此很陌生!
  • 使用not 代替None 的提示非常有帮助!谢谢。
猜你喜欢
  • 2021-07-05
  • 2021-07-12
  • 2018-01-16
  • 2016-05-14
  • 2016-12-21
  • 2022-01-23
  • 2022-01-23
  • 2019-11-01
  • 2021-08-23
相关资源
最近更新 更多