这里还有很多关于 AttributeErrors 的其他问题,但我已经阅读了它们,但仍然不确定在我的具体情况下是什么导致了类型不匹配。
提前感谢您对此的任何想法。
我的模型:
class Object(db.Model):
notes = db.StringProperty(multiline=False)
other_item = db.ReferenceProperty(Other)
time = db.DateTimeProperty(auto_now_add=True)
new_files = blobstore.BlobReferenceProperty(required=True)
email = db.EmailProperty()
is_purple = db.BooleanProperty()
我的 BlobstoreUploadHandler:
class FormUploadHandler(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
try:
note = self.request.get('notes')
email_addr = self.request.get('email')
o = self.request.get('other')
upload_file = self.get_uploads()[0]
# Save the object record
new_object = Object(notes=note,
other=o,
email=email_addr,
is_purple=False,
new_files=upload_file.key())
db.put(new_object)
# Redirect to let user know everything's peachy.
self.redirect('/upload_success.html')
except:
self.redirect('/upload_failure.html')
每次我提交上传文件的表单时,它都会抛出以下异常:
ERROR 2010-10-30 21:31:01,045 __init__.py:391] 'unicode' object has no attribute 'has_key'
Traceback (most recent call last):
File "/home/user/Public/dir/google_appengine/google/appengine/ext/webapp/__init__.py", line 513, in __call__
handler.post(*groups)
File "/home/user/Public/dir/myapp/myapp.py", line 187, in post
new_files=upload_file.key())
File "/home/user/Public/dir/google_appengine/google/appengine/ext/db/__init__.py", line 813, in __init__
prop.__set__(self, value)
File "/home/user/Public/dir/google_appengine/google/appengine/ext/db/__init__.py", line 3216, in __set__
value = self.validate(value)
File "/home/user/Public/dir/google_appengine/google/appengine/ext/db/__init__.py", line 3246, in validate
if value is not None and not value.has_key():
AttributeError: 'unicode' object has no attribute 'has_key'
最让我感到困惑的是,这段代码几乎直接来自文档,并且与我在教程中在线找到的其他 blob 上传处理程序示例混在一起。
我已经运行 --clear-datastore 以确保我对 DB 模式所做的任何更改都不会导致问题,并尝试将其转换upload_file
为各种东西以查看它是否会安抚 Python - 关于我的任何想法搞砸了?
编辑:我找到了一种解决方法,但它不是最理想的。
将 UploadHandler 更改为此可以解决问题:
...
# Save the object record
new_object = Object()
new_object.notes = note
new_object.other = o
new_object.email = email.addr
new_object.is_purple = False
new_object.new_files = upload_file.key()
db.put(new_object)
...
在注意到注释掉文件行后,我进行了此切换,该行引发了相同的问题other
,依此类推。但是,这不是一个最佳解决方案,因为我不能以这种方式强制验证(在模型中,如果我根据需要设置任何内容,我不能像上面那样声明一个空实体而不抛出异常)。
关于为什么我不能同时声明实体并填充它的任何想法?