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'

最让我感到困惑的是,这段代码几乎直接来自文档,并且与我在教程中在线找到的其他 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,依此类推。但是,这不是一个最佳解决方案,因为我不能以这种方式强制验证(在模型中,如果我根据需要设置任何内容,我不能像上面那样声明一个空实体而不抛出异常)。

关于为什么我不能同时声明实体并填充它的任何想法?

4

3 回答 3

2

您传入o的值是other_item(在您的示例代码中,您称它为other,但我认为这是一个错字)。o但是,它是从请求中获取的字符串,并且模型定义指定它是 a ReferenceProperty,因此它应该是Other类的实例或db.Key对象。

如果o应该是一个字符串化的键,db.Key(o)请改为传入以反序列化它。

Object顺便说一句,对于数据存储类(或任何类,真的)来说,这是一个非常糟糕的名称——Python 基础对象被称为object,而这只是一个大写字母的距离——很容易出错。

于 2011-12-15T00:21:55.900 回答
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 回答