Python, что это значит «AttributeError: объект« Юникод »не имеет атрибута« has_key »»

Я хотел бы спросить, что это значит "AttributeError: объект 'Unicode' не имеет атрибута 'has_key'" Вот полная трассировка стека:

Traceback (most recent call last):
  File     "D:\Projects\GoogleAppEngine\google_appengine\google\appengine\ext\webapp\__init__.py", line 509, in __call__
    handler.post(*groups)
  File "D:\Projects\workspace\foo\src\homepage.py", line 71, in post
    country=postedcountry
  File "D:\Projects\GoogleAppEngine\google_appengine\google\appengine\ext\db\__init__.py", line 656, in __init__
    prop.__set__(self, value)
  File "D:\Projects\GoogleAppEngine\google_appengine\google\appengine\ext\db\__init__.py", line 2712, in __set__
    value = self.validate(value)
  File "D:\Projects\GoogleAppEngine\google_appengine\google\appengine\ext\db\__init__.py", line 2742, in validate
    if value is not None and not value.has_key():
AttributeError: 'unicode' object has no attribute 'has_key'

Позвольте мне немного подробнее рассказать о ситуации:

Сначала я создал models.py с db.Model для CMSRequest с атрибутом country, который ссылается на класс CMSCountry.

class CMSRequest(db.Model):
  country = db.ReferenceProperty(CMSCountry, required=True)

class CMSCountry(db.Model):
  name = db.StringProperty(required=True)

Затем я создал класс массового загрузчика для импорта данных в CMSCountry

В форме пользователь может выбрать страну из выпадающего списка, результаты будут опубликованы и сохранены в объект CMSRequest

def post(self):
  postedcountry = self.request.get('country')
  cmsRequest = models.CMSRequest(postedcountry)

Возможно, я нашел решение своего вопроса, потому что я не преобразовал опубликованный ключ CMSCountry обратно для сохранения в CMSRequest.

Спасибо всем!

Ответы на вопрос(6)

    if value is not None and not value.has_key():
AttributeError: 'unicode' object has no attribute 'has_key'

Это говорит оvalue Переменная, которую вы используете, не имеетhas_key приписывать. И это говорит вам о том, что вашvalue переменная не словарь, как кажется, вы ожидаете ... вместо этого это объект Unicode, который в основном является строкой.

го выражение «in». Если вы используете старую библиотеку в 3.x, вы должны внести изменения в код для ее адаптации.

country' в CMSCountry - это db.ReferenceProperty, которое принимает объект db.Key или CMSCountry, но вы пытаетесь установить его в строку.

Вы должны делать что-то вроде этого:

def post(self):
  postedcountry = self.request.get('country')
  country = models.CMSCountry.all().filter('name =', postedcountry)
  if not country:
    # Couldn't find the country
  else:
    cmsRequest = models.CMSRequest(country=country)

Пожалуйста, сделайсообщить об ошибке о довольно бесполезном сообщении об ошибке.

отображающие" типы в Python (словари и словарные классы ... такие как различные типы dbm (индексированный файл) и некоторые интерфейсы СУБД / ORM ... реализуютhas_key() метод.

Каким-то образом вы добавили объект Unicode (строковый) в этот оператор, когда вы ожидали иметь какой-либо словарь или другую ссылку на объект сопоставления.

В общемAttributeError означает, что вы запутали привязки вашего объекта (присваивание переменных). Вы дали имя некоторому объекту, отличному от того, который вы намеревались. (Или иногда это означает, что у вас есть опечатка типа ".haskey ()" вместоhas_key() ... и т.д).

Кстати: использованиеhas_key() несколько устарела. Обычно лучше протестировать ваши контейнеры с Pythonin оператор (который неявно вызывает__contains__() --- и который работает со списками, строками и другими последовательностями, а также с типами отображения).

Такжеvalue.has_key() вызовет ошибку, даже еслиvalue был словарь со времен.has_key() Метод требует аргумента.

В вашем коде я бы либо явно проверить дляif postedcountry is not None: ... или я бы поставил ваш.get() с (необязательным) значением по умолчанию для "postscountry".

Как вы хотите справиться с ситуацией, когдаrequest не имелpostedcountry? Вы хотите предположить, что это отправлено от некоторого определенного по умолчанию? Принудительно перенаправить на некоторую страницу, которая требует от пользователя предоставить значение для этого элемента формы? Оповещение испанской инквизиции?

что опубликованная страна является строкой, а не объектом страны. Значения, полученные из self.request.get, являются строковыми значениями переменных, передаваемых браузером.

Вам нужно искать объект страны, используя некоторый GQL. Как именно вы это сделаете, будет зависеть от того, какое именно поле страны в вашей HTML-форме возвращается, ключ объекта ?, название страны?

def post(self):
  postedcountry = self.request.get('country')

  # <-------- Need to look up a country here !!!!!

  cmsRequest = models.CMSRequest(country=postedcountry)
Решение Вопроса

В этой строке:

if value is not None and not value.has_key():

value является строкой Unicode. Похоже, код ожидает, что это будетdb.Model,

(Из того, что я вижу,has_key это методdb.Model, а также метод словарей Python, но это должно бытьdb.Model один, потому что он вызывается без аргументов.)

Вы передаете строку в API GAE, которая ожидаетdb.Model?

 RichieHindle22 авг. 2009 г., 13:03
@ Хоанг: Похоже, вам нужно что-то вродеcmsRequest = models.CMSRequest(country=models.CMSCountry(postedcountry)) (Я не знаю, является ли это правильным способом получитьCMSCountry из строки, но вы видите, что я говорю).
 Hoang Pham22 авг. 2009 г., 12:24
привет, я отредактировал вопрос еще с кодом
 Hoang Pham06 сент. 2009 г., 00:16
Спасибо Ричи, основываясь на вашем предложении, я изменил код следующим образом: def post (self): postscountry = self.request.get ('country') страна = models.CMSCountry.get (postscountry) cmsRequest = models.CMSRequest ( страна) Ключ страны должен быть заполнен в html для вариантов, и у опубликованной страны будет ключ CMSCountry.

Ваш ответ на вопрос