AttributeError: «Инструментальный список»

Я новичок в использовании как SQLALCHEMY, так и PYRAMID веб-фреймворка. Я борюсь с тем, что может быть простым решением для некоторых, но я не смог понять это. Я просмотрел некоторые сообщения здесь стеки, но они не совсем отвечают на мою проблему.

У меня есть отношение many-to-many в моей таблице database. Я пытаюсь return получить объект (categories) из родительской таблицы assessment. В данный момент я пытаюсь: return {'name': assessment.name, 'text': assessment.text, 'user': assessment.user_id, 'video':assessment.video_id, 'categories': assessment.categories.assessment_category_link} но это не работает --> 'categories': assessment.categories.assessment_category_link

Я могу вернуть все объекты, кроме категорий. Ниже приведена соответствующая ошибка и код.

ВЫСЛЕЖИВАТЬ:

 line 306, in get_assessment
    return {'name': assessment.name, 'text': assessment.text, 'user': assessment.user_id, 'video':assessment.video_id, 'categories': assessment.categories.assessment_category_link}
AttributeError: 'InstrumentedList' object has no attribute 'assessment_category_link'

SQLALCHEMY ТАБЛИЦА/ОТНОШЕНИЕ:

# MANY-to-MANY
association_table = Table('assessment_category_link', Base.metadata,
    Column('assessment_id', Integer, ForeignKey('assessments.assessment_id')),
    Column('category_id', Integer, ForeignKey('categories.category_id')))

class Assessment(Base):
    # column/entity code
    categories = relationship('Category', secondary='assessment_category_link', backref='assessments')

    def __init__(self, name, text, user, video, categories):
        # CODE 
        self.categories = categories

Метод GET(), в частности значение return, которое вызывает ошибку:

@view_config(route_name='assessment', request_method='GET', renderer='json')
def get_assessment(request):
    with transaction.manager:
        assessment_id = int(request.matchdict['id'])
        assessment = api.retrieve_assessment(assessment_id)
        if not assessment:
            raise HTTPNotFound()
        return {'name': assessment.name, 'text': assessment.text, 'user': assessment.user_id, 'video':assessment.video_id, 'categories': assessment.categories.assessment_category_link}

person thesayhey    schedule 24.09.2015    source источник


Ответы (2)


Я не уверен, чего вы пытаетесь достичь, поскольку assessment.categories вернет список объектов Category, которые вам нужно перебрать. Логично, что такой список не имеет атрибута с именем assessment_category_link (как говорит вам исключение), и мне непонятно, зачем вам вообще нужен доступ к объекту ассоциации!

Связь с аргументом ключевого слова secondary предназначена для того, чтобы скрыть эту сложность, чтобы assessment.categories прозрачно возвращал нужный вам список.

вы можете представить список категорий, как вам нравится, предложение для вашего случая:

{...., 'categories': ', '.join([str(i) for i in assessment.categories])}
person architectonic    schedule 24.09.2015
comment
Я пытаюсь отобразить объекты для печати на шаблоне JINJA, например. {{оценка.categories}} - person thesayhey; 24.09.2015
comment
Основываясь на вашем ответе, я предполагаю, что мне следует просто вручную ввести их в шаблон в виде HTML. - person thesayhey; 24.09.2015
comment
тогда зачем вам объект ассоциации? просто переберите список категорий - person architectonic; 24.09.2015
comment
Просто для ясности: вы предлагаете мне перебрать шаблон JINJA, вызвав объект? - person thesayhey; 24.09.2015
comment
представлять список категорий как угодно, например можно написать {...., 'categories': ', '.join(assessment.categories)} - person architectonic; 24.09.2015
comment
пожалуйста, примите ответ или проголосуйте за него (не комментарий), если вы найдете его полезным, спасибо :) - person architectonic; 24.09.2015
comment
Это соединение по-прежнему выдает TypeError: sequence item 0: expected string, Category found - person thesayhey; 29.09.2015
comment
Отредактировано по вашему предложению - person architectonic; 30.09.2015

Ответ выше был очень близок, но рабочий code таков:

{...., 'categories': ','.join([str(i) for i in assessment.categories])}

Как было предложено в аналогичном вопросе/ответе стека на ту же проблему: TypeError: sequence элемент 0: ожидаемая строка, целое найдено

person thesayhey    schedule 29.09.2015