ここで 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'
私を最も困惑させたのは、このコードがドキュメントからほぼそのまま出てきており、チュートリアルでオンラインで見つけたブロブ アップロード ハンドラの他の例とも一致していることです。
--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
行に同じ問題が発生することに気付いた後、この切り替えを行いました。ただし、この方法で検証を強制することはできないため、これは最適なソリューションではありません (モデルでは、必要に応じて何かを設定すると、例外をスローせずに上記のように空のエンティティを宣言することはできません)。
エンティティを宣言して同時に入力できない理由について何か考えはありますか?