首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检索方法问题?AttributeError抱怨“str”对象

检索方法问题?AttributeError抱怨“str”对象
EN

Stack Overflow用户
提问于 2015-10-02 16:32:45
回答 2查看 69关注 0票数 1

问题是:AttributeError: 'str' object has no attribute '_sa_instance_state'和我不知道如何解决这个问题。我相信它与下面的retrieve方法有关。Stacks上的某个人也有类似的问题,这只是一个简单的改变function...this的问题,对我来说并非如此。

回溯:

代码语言:javascript
复制
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

代码语言:javascript
复制
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)

convenience.py (继承自object.py)

代码语言:javascript
复制
def create_category_rating(self, category_rating_int, category_name, username, name):
    category = self.retrieve_category(category_name)
    owner = self.retrieve_user(username)  
    assessment = self.retrieve_assessment(name)  
    assessment_result = self.retrieve_assessment_result(owner, assessment)
    return super(ConvenienceAPI, self).create_category_rating(category_rating_int, category, assessment_result)

model.py

代码语言:javascript
复制
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)

test.py

代码语言:javascript
复制
api = ConvenienceAPI()
api.create_category_rating(2, 'Decision-Making', 'baseball', 'Becoming a Leader')
EN

回答 2

Stack Overflow用户

发布于 2015-10-02 17:27:39

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

您要将一个列表分配给uselist=False所在的关系。您应该设置单个模型实例,而不是包含它的列表。

在您的示例中,属性assessment_results被定义为多对一关系(例如,单个Category_Rating可以有单个Assessment_Results实例,但是单个Assessment_Results可以有多个Category_Rating实例)。如果您这样做,下面重命名,以前的语句将对您更有意义:

代码语言:javascript
复制
assessment_results -> assessment_result
assessment_results_id -> assessment_result_id
Assessment_Results -> Assessment_Result

问题是assessment_results属性需要Assessment_Results模型的单个实例,但是您将其设置为方法retrieve_assessment_results()的结果,该方法返回Assessment_Results的列表。这就是失败的原因。

UPD

第二个问题是这个字符串filter(Assessment_Result.owner == owner).one()。您尝试将Owner实例与字符串进行比较。您可能想用类似于filter(Owner.name == owner).one()的东西来替换它。在没有看到这些模型定义的情况下,你无法准确地告诉你。

票数 2
EN

Stack Overflow用户

发布于 2015-10-02 20:28:01

我和亚罗斯拉夫·行政当局合作,做了一些与他的建议类似的事.我在assessment_result(..) ( convenience.py )中添加了一个检索方法,用于检查字符串:

工作代码:

(这是从object.py文件继承的-如上所示)

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32911751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档