Python Can';在SQLAlchemy flask中的结果对象上设置属性
我在Flask SQLAlchemy中遇到问题,我可以设置place_集合中对象的属性,但当我想为places中的对象设置属性时,出现了一个错误:Python Can';在SQLAlchemy flask中的结果对象上设置属性,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,我在Flask SQLAlchemy中遇到问题,我可以设置place_集合中对象的属性,但当我想为places中的对象设置属性时,出现了一个错误: Traceback (most recent call last): File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 2309, in __call__ return self.wsgi_app(e
Traceback (most recent call last):
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/werkzeug/contrib/fixers.py", line 152, in __call__
return self.app(environ, start_response)
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
raise value
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
raise value
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/user/Document/Python/Test/Code/app/main/views.py", line 108, in index
place.distance = round(distance_computing, 1)
AttributeError: can't set attribute
如何设置join search对象的属性,有人可以帮助我吗
place_collections = Place.query.filter_by(county='BKK')
places = db.session.query(Place.roll_number, Place.name, Place.website, Place.address, Place.distance)
.outerjoin(Rank, Rank.place_id == Place.place_id)
它们都是类“flask\u sqlalchemy.BaseQuery”类型
型号
class Rank(db.Model):
__tablename__ = 'rank'
place_id = db.Column(db.String(50))
name = db.Column(db.String(255), nullable=False, primary_key=True)
rank = db.Column(db.Integer)
class Place(db.Model):
_tablename_ = 'school'
place_id = db.Column(db.String(50), primary_key=True)
roll_number = db.Column(db.String(50))
name = db.Column(db.String(255), nullable=False)
address = db.Column(db.String(255))
distance = db.Column(db.String(50))
rank = db.relationship('Rank',backref=db.backref('roll_number1'), lazy=True, uselist=False)
place\u collections=place.query.filter\u by(county='BKK')
将返回place
对象的集合。这类似于普通炼金术中的session.query(Place).filter_by(county='BKK')
但是,从SQLAlchemy:
该查询还接受ORM插入指令的描述符作为参数。任何
时间多个类实体或基于列的实体表示为
对于query()函数的参数,返回结果表示为
元组
关键点在于,当您指定要查询的特定列时(如此处所述):
places = db.session.query(Place.roll_number, Place.name,
Place.website, Place.address, Place.distance).\
outerjoin(Rank, Rank.place_id == Place.place_id)
结果表示为元组的集合
我的第一印象是,无法设置属性
是一条奇怪的错误消息,试图将属性值分配给元组
,因此我尝试了:
>>> t = tuple()
>>> t.attribute = 9
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'attribute'
因此,sqlalchemy.util.\u collections.result
是一种tuple
类型
如果我们尝试为一个属性分配一个值,该属性不是查询的列之一:
>>> a_result.newattribute = 'something'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'result' object has no attribute 'newattribute'
这与您收到的错误消息相同
因此,sqlalchemy.util.\u collections.result
对象支持列名的属性访问,但由于它是一个元组,所以它仍然是不可变的,因此无法写入这些属性
要修复您的特定错误(除非出于某种原因您专门查询了这些列),请将您的places
查询更改为:
places = db.session.query(Place).outerjoin(Rank, Rank.place_id == Place.place_id)
此错误的另一个可能原因(“AttributeError:无法设置属性”错误)是当列和属性的名称相同时
我碰巧有一个以前添加(忘记)的@属性
,然后创建了一个同名列
>>> q = session.query(Racecard.id, Racecard.meeting)
>>> a_result = q[0]
>>> type(a_result)
<class 'sqlalchemy.util._collections.result'>
>>> issubclass(type(a_result), tuple)
True
>>> a_result.newattribute = 'something'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'result' object has no attribute 'newattribute'
>>> from collections import namedtuple
>>> Racecard = namedtuple('Racecard', 'id, meeting')
>>> rc = Racecard(1, 'Doomben')
>>> rc.meeting = 'Eagle Farm'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
places = db.session.query(Place).outerjoin(Rank, Rank.place_id == Place.place_id)