Python 检索方法问题?归因者错误抱怨';str';对象

Python 检索方法问题?归因者错误抱怨';str';对象,python,sqlalchemy,traceback,Python,Sqlalchemy,Traceback,问题:AttributeError:“str”对象没有属性“\u sa\u instance\u state”,我不确定如何修复它。 我相信这与下面的retrieve方法有关。上有人有类似的问题,这是一个简单的问题,改变功能…这不是我的情况 回溯: Traceback (most recent call last): File "/usr/local/lib/python2.7/site-packages/nose/case.py", line 197, in runTest sel

问题:
AttributeError:“str”对象没有属性“\u sa\u instance\u state”
,我不确定如何修复它。 我相信这与下面的
retrieve
方法有关。上有人有类似的问题,这是一个简单的问题,改变功能…这不是我的情况

回溯:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/ack/code/venv/NotssDB/notssdb/test/test.py", line 132, in test1
    api.retrieve_assessment_result('baseball', 'Becoming a Leader')
  File "/Users/ack/code/venv/NotssDB/notssdb/api/object.py", line 324, in retrieve_assessment_result
    filter(Assessment_Result.owner == owner).one()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/sql/operators.py", line 301, in __eq__
    return self.operate(eq, other)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 175, in operate
    return op(self.comparator, *other, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/relationships.py", line 1011, in __eq__
    other, adapt_source=self.adapter))
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/relationships.py", line 1338, in _optimized_compare
    state = attributes.instance_state(state)
AttributeError: 'str' object has no attribute '_sa_instance_state'
object.py

def retrieve_assessment_result(self, *args):
    id, owner, assessment = None, None, None
    if len(args) == 1:
        id, = args[0]
    elif len(args) == 2:
        owner, assessment = args
    else:
        raise ValueError('Value being passed is an object')
    if id is not None:
        return self.session.query(Assessment_Result).\
        filter(Assessment_Result.id == id).one()
    elif owner is not None:
        print 'test1', owner
        return self.session.query(Assessment_Result).\
        filter(Assessment_Result.owner == owner).one()
    elif assessment is not None:
        print 'test2', assessment
        return self.session.query(Assessment_Result).\
        filter(Assessment_Result.assessment == assessment).one()

def create_category_rating(self, category_rating_int, category, assessment_result):
    new_catrating = Category_Rating(category_rating_int, category, assessment_result)
    self.session.add(new_catrating)
    print(new_catrating)
    self.session.commit()
    return(new_catrating)
便利性 (从object.py继承)

model.py

class Category_Rating(Base):
    __tablename__ = 'category_ratings'

    id = Column(Integer, primary_key=True)
    category_rating_int = Column(Integer)

    category_id = Column(Integer, ForeignKey('categories.category_id'))
    category = relationship('Category', backref='category_ratings')

    assessment_result_id = Column(Integer, ForeignKey('assessment_results.id'))
    assessment_result = relationship('Assessment_Result', backref='category_ratings')

    def __init__(self, category_rating_int, category, assessment_result): #OBJECT
        self.category_rating_int = category_rating_int
        self.category = category
        self.assessment_result  = assessment_result

    def __repr__(self):
        return "<Category_Rating(category_rating_int='%s')>" % (self.category_rating_int)

您的问题与链接问题中的问题完全相同:

您正在为关系分配一个列表,其中
uselist=False
。您应该设置单个模型实例,而不是包含它的列表

在您的案例中,属性
评估结果
定义为多对一关系(例如,单个
类别评级
可以有单个
评估结果
实例,但单个
评估结果
可以有多个
类别评级
实例)。如果您进行以下重命名,则前面的语句将对您更有意义:

assessment_results -> assessment_result
assessment_results_id -> assessment_result_id
Assessment_Results -> Assessment_Result
问题是,
评估结果
属性需要单个
评估结果
模型实例,但您将其设置为方法的结果
检索评估结果()
,该方法返回
评估结果列表
。这就是它失败的原因

UPD


第二个问题是这个字符串
过滤器(Assessment\u Result.owner==owner).one()
。您尝试将
Owner
实例与字符串进行比较。您可能希望将其替换为类似于
过滤器(Owner.name==Owner.one()
的内容。如果没有看到这些模型的定义,就无法准确地告诉您。

与Yaroslav管理员合作,我做了一些类似于他的建议的事情。。。我在profession.py(api)中添加了一个用于检查字符串的
评估结果(..)
检索方法:

工作代码:
(这继承自object.py文件——如上所示)


请包括您的模型定义。这样人们就可以重现你的错误。当您调用
create\u category\u rating(…)
时,还包括作为参数传递的值。您是否阅读了链接问题的解释?问题不在于改变功能。它清楚地解释了问题所在:“您正在为关系分配一个列表,其中
uselist=False
。您应该设置单个模型实例,而不是包含它的列表。”。当您创建
Category\u Rating
实例时,您很可能也在这样做。@YaroslavAdmin是的,我有。我现在已经把要求的材料寄出去了。我正在努力理解我自己,因为我对这一切都不熟悉。非常感谢你的解释!非常感谢。只需澄清:
评估结果
是一个表格,用于保存每个
评估
及其各自的
类别
。因此,
Assessment\u Results
将根据
Assessment\u Results
获得大约4个
category\u评级。您不需要将关系定义移动到
Assessment\u Results
模型。只需确保从
retrieve\u assessment\u results()
方法返回单个实例即可。根据您的数据结构,使用或代替
.all()
。我更改了命名约定(以防止误解),谢谢!当我通过
.one()
时,它返回
AttributeError:“str”对象没有属性“\u sa\u instance\u state”
,因此我可以根据您的建议更新我的问题以更准确地反映这一点,并使用新代码更新问题并添加新的回溯。或者你可以自己调试。很可能是将字符串而不是模型指定给关系。
api = ConvenienceAPI()
api.create_category_rating(2, 'Decision-Making', 'baseball', 'Becoming a Leader')
assessment_results -> assessment_result
assessment_results_id -> assessment_result_id
Assessment_Results -> Assessment_Result
def retrieve_assessment_result(self, username, name):
    owner = self.retrieve_user(username)
    assessment = self.retrieve_assessment(name)
    return super(ConvenienceAPI, self).retrieve_assessment_result(owner, assessment)