Проблема с визуализацией объекта списка: AttributeError: объект 'list' не имеет атрибута ''

Я пытаюсь отобразить старый добрый JSON через return {'category_name': category.category_name} в файле views.py. Я использую Pyramid Web Framework. Я использую пользовательский веб-API RESTful и дизайн CRUD в базе данных SQLALCHEMY.

По какой-то причине я продолжаю получать 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... что сбивает с толку. Возможно, чтобы вернуть значение списка, мне нужно использовать специальный синтаксис? Я не смог найти в Интернете ничего, что имело бы для меня смысл (это был наиболее актуальный), но будем очень признательны за любые рекомендации! Я уверен, что это что-то простое.

Метод 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 (очень похоже на функцию Create в DB API):

@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)

person thesayhey    schedule 24.09.2015    source источник
comment
Ошибка ясно говорит, что category - это список. Пожалуйста, опубликуйте код, который создает category.   -  person Javier    schedule 24.09.2015
comment
Код категории POST (создать) указан выше. Сейчас добавлю API для БД.   -  person thesayhey    schedule 24.09.2015
comment
Пожалуйста, добавьте код api.retrieve_category.   -  person Javier    schedule 24.09.2015
comment
Похоже, api.retrieve_category возвращает list, возможно, пустой, а не объект или None, как ожидалось.   -  person Dan D.    schedule 24.09.2015
comment
@ДанД. Да, он возвращает список. Что я и хочу напечатать. Каков синтаксис для печати/рендеринга списка в возвращаемом значении JSON? должен же быть способ?   -  person thesayhey    schedule 24.09.2015


Ответы (1)


api.retrieve_category() возвращает список, как показывает исключение. Что вы ожидаете, что он вернется?

Вам нужно проверить, что возвращает ваш API. Возможно, вы могли бы получить доступ к первому элементу в возвращаемом списке, чтобы это могло работать:

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

Однако, если API на самом деле возвращает пустой список ([]), что означает отсутствие результата, вам нужно проверить это, а не None:

if not category:
    raise HTTPNotFound()
person mhawke    schedule 24.09.2015
comment
оно работает! Спасибо. Я знал, что это проблема, я просто не знал правильного синтаксиса для печати списка в возвращаемом значении JSON. Я совсем новичок в этом! - person thesayhey; 24.09.2015
comment
Совет по использованию not вместо None очень полезен! Спасибо. - person thesayhey; 24.09.2015