0

ここで 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行に同じ問題が発生することに気付いた後、この切り替えを行いました。ただし、この方法で検証を強制することはできないため、これは最適なソリューションではありません (モデルでは、必要に応じて何かを設定すると、例外をスローせずに上記のように空のエンティティを宣言することはできません)。

エンティティを宣言して同時に入力できない理由について何か考えはありますか?

4

3 に答える 3

1

has_key エラーは、ReferenceProperty other_items が原因です。appengine の API が dict を予期しているときに、other_items に '' を渡している可能性があります。これを回避するには、other_items をハッシュに変換する必要があります。

于 2011-12-11T02:48:53.963 に答える
0

[警告レクター:「google_app_engine」についてzilchを知っています]

dictこのメッセージは、指定したオブジェクトではなく、 (属性を持つ唯一の既知のオブジェクトhas_key)または類似のオブジェクトを予期していることを示していunicodeます。おそらくあなたは合格するべきであり、 ...upload_fileではありませんupload_file.key()

于 2010-10-30T23:53:21.323 に答える