AttributeError: 'InstrumentedList'
AttributeError: 'InstrumentedList'
我对使用 SQLALCHEMY
和 PYRAMID
网络框架还很陌生。我正在为一些可能是简单的修复而苦苦挣扎,但我一直无法弄清楚。我看过一些 posts here on ,但它们并没有完全回答我的问题。
我在 database
table 中有一段 many-to-many
关系。我正在尝试 return
来自父 table assessment
的对象 (categories
)。我现在正在尝试: 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
我能够 return 除了类别之外的所有对象。下面是相关错误和代码。
回溯:
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 TABLE/RELATIONSHIP:
# 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}
我不确定你想要达到什么目的,因为 assessment.categories
会 return 一个你需要迭代的 Category
对象的列表。这样的列表没有名为 assessment_category_link
的属性是合乎逻辑的(正如异常告诉你的那样),我不清楚你为什么要访问关联对象!
与 secondary
关键字参数的关系 旨在 隐藏这种复杂性,以便 assessment.categories
透明地 return 列表你在找。
类别列表你可以随意表示,给你的案例一个建议:
{...., 'categories': ', '.join([str(i) for i in assessment.categories])}
上面的答案非常接近,但工作 code
是:
{...., 'categories': ','.join([str(i) for i in assessment.categories])}
正如类似 Stack question/answer 对同一问题的建议:TypeError: sequence item 0: expected string, int found
我对使用 SQLALCHEMY
和 PYRAMID
网络框架还很陌生。我正在为一些可能是简单的修复而苦苦挣扎,但我一直无法弄清楚。我看过一些 posts here on
我在 database
table 中有一段 many-to-many
关系。我正在尝试 return
来自父 table assessment
的对象 (categories
)。我现在正在尝试: 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
我能够 return 除了类别之外的所有对象。下面是相关错误和代码。
回溯:
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 TABLE/RELATIONSHIP:
# 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}
我不确定你想要达到什么目的,因为 assessment.categories
会 return 一个你需要迭代的 Category
对象的列表。这样的列表没有名为 assessment_category_link
的属性是合乎逻辑的(正如异常告诉你的那样),我不清楚你为什么要访问关联对象!
与 secondary
关键字参数的关系 旨在 隐藏这种复杂性,以便 assessment.categories
透明地 return 列表你在找。
类别列表你可以随意表示,给你的案例一个建议:
{...., 'categories': ', '.join([str(i) for i in assessment.categories])}
上面的答案非常接近,但工作 code
是:
{...., 'categories': ','.join([str(i) for i in assessment.categories])}
正如类似 Stack question/answer 对同一问题的建议:TypeError: sequence item 0: expected string, int found