我怀疑我的代码。找了几个小时,还是没弄明白。
这是一件非常简单的事情我正在尝试查询具有给定 ID 的表。然后我想用传递的名称更新“名称”属性。
但它给了我一个错误 - TypeError: 'Bucket' object does not support item assignment
。 it's like its not returning a dictionary
# PUT REQUEST
def put(self, id):
bucket_to_update = bucket_db.query.get(id) #### returns <Bucket id> , not dict
print(bucket_to_update) # prints the bucket as string
if not bucket_to_update:
return {"status": "failure"}, 404
args = BucketAPI.parser.parse_args()
name = args.get('name', None)
bucket_to_update['name'] = name # >>>>>>>>>>>>>>>>>>>> PRODUCES AN ERROR
db.session.commit()
return {"status" "success"}, 200
"""Bucket model"""
from todo_app import db
class Bucket(db.Model):
__tablename__ = 'buckets'
def __init__(self, name):
self.name = name
id = db.Column(
db.Integer,
primary_key=True
)
name = db.Column(
db.Text,
index=True,
unique=True,
nullable=False
)
items = db.relationship('Item',
backref=db.backref('bucket', lazy='joined'),
lazy=True)
def __repr__(self):
return '<bucket-{}> '.format(self.name)
从 docs 和 link 可以清楚地看出我们可以更新 details as dictionary
,但在这里它不起作用。
bucket_to_update['name'] = name
TypeError: 'Bucket' object does not support item assignment
p.s- 我正在创建一个 Resource 类,以使用flask-restful 具有不同的创建/删除方法
正如评论和答案所指出的,它是一个对象而不是字典,您应该将它作为 bucket.name=name
访问。另外我回来的时候漏了一个冒号。
答案 0 :(得分:2)
我无法访问我的编码环境,但我认为如果您遵循它应该可以正常工作。
bucket_to_update.name = name
答案 1 :(得分:0)
添加 (3) 在 def put(self, id):
的末尾,
将 return {"status" "success"}, 200
更正为 return {"status":"success"}, 200
(1) 在您的 class Bucket(db.Model):
中,您定义了初始化函数 __init__
,因此您覆盖了父类 db.Model
的初始化函数,因此父类的 __init__
函数将不被调用。
因此,尝试:
def __init__(self, name):
db.Model.__init__(self) ## *** invoke __init__ of the parent class
self.name = name
(2) 更新bucket_to_update
中的修改:
bucket_to_update['name'] = name # >>>>>>>>>>>>>>>>>>>> PRODUCES AN ERROR
db.session.commit()
在提交前添加db.session.add(bucket_to_update)
:
bucket_to_update['name'] = name # >>>>>>>>>>>>>>>>>>>> PRODUCES AN ERROR
db.session.add(bucket_to_update)
db.session.commit()
正在寻找您的评论。
祝你好运。