2015-09-24 2 views
0

Я довольно новичок в использовании как SQLALCHEMY, так и веб-рамки PYRAMID. Я борюсь за то, что может быть простым решением для некоторых, но я не смог понять это. Я посмотрел на некоторые postshere onStacks, но они не совсем отвечают на мою проблему.AttributeError: 'InstrumentedList'

У меня есть 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

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

след вызовов TRACEBACK:

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} 

ответ

1

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

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

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

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

Я пытаюсь отобразить объекты для печати на шаблоне JINJA, например {{evaluation.categories}} – thesayhey

+0

Основываясь на вашем ответе, я предполагаю, что я просто должен вручную ввести их в шаблон как HTML. – thesayhey

+0

, то зачем вам нужен объект ассоциации? просто перебирайте список категорий – architectonic

1

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

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

Как было предложено аналогичный вопрос в стеке/ответ на тот же вопрос: TypeError: sequence item 0: expected string, int found