Обновление модели на сервере хранилища данных Gae

У меня есть класс профиля:

class profile(db.Model):
  user = db.stringProperty()
  # Other properties ...
  access = db.ListProperty(db.keys)

class apps(db.Model):
  name = db.StringProperty()

Класс профиля был там какое-то время, но недавно мы добавили поле доступа, в котором будут храниться ключи приложений. Теперь мы добавляем разрешения профиля в приложение, поле доступа не обновляется в модели.

Это отлично работает на локальном хосте, но когда я обновляю это на сервере, я получаю эту ошибку «Объект« NoneType »не имеет атрибута« доступ »». Кто-нибудь сталкивался с такой же ситуацией?

Обновление: выяснилось, что один из объектов из класса профиля возвращается как None. Вот код, который получает объект профиля на локальном хосте, но не на сервере

 liuser = users.User(request.POST['user']) 
 #request.POST['user'] gets user Gmail ID, which is being converted to user object
 profiles=Profile.all().filter(" user =", liuser).get()
 userprofile=profiles

 #tried below code which returns "'NoneType' object has no attribute 'access'" on server, the same gets a profile object on localhost
 if not hasattr(userprofile, "access"): 
    userprofile.access=[]

@ Роберт, надеюсь, с форматированием все в порядке.

Спасибо, Саи Кришна


person J Bourne    schedule 16.11.2010    source источник
comment
Легче читать и отвечать на ваш вопрос, если ваш код отформатирован.   -  person Robert Kluin    schedule 16.11.2010
comment
Не могли бы вы включить код, который вы используете для чтения и обновления объектов профиля. Вы также можете включить фактический код, который вы используете. В вашем коде есть несколько проблем, таких как db.keys и db.stringProperty.   -  person Robert Kluin    schedule 16.11.2010


Ответы (2)


Мы смогли это исправить. Проблема была с объектом users.User, который не добавляет @gmail.com для пользователей gmail, но принимает другие домены с доменным именем, которое выбрасывало объект None Type

Спасибо еще раз за помощь

person J Bourne    schedule 18.11.2010

Когда вы добавляете свойство в модель, существующие экземпляры модели в хранилище данных не получают это свойство автоматически.

Вам нужно будет изменить код обработчика, который взаимодействует с объектами профиля, чтобы проверить наличие доступа. Функция Python hasattr подойдет. Что-то вроде этого:

a_profile = profile.all().somequerystuffheretogetaninstance().get()
if a_profile is not None:
    if not hasattr(a_profile, "access"):
        a_profile.access = whateveryourdefaultdatais
    # perform my data logic normally after this, but remember to persist
    # this to the datastore to save the new access property.
person Adam Crossland    schedule 16.11.2010
comment
Я думаю, это решило бы мою проблему, но то, что я сделал, я создал совершенно новое приложение с новой схемой модели и изменил имя в файле app.yaml, даже тогда оно не создало новое поле. Однако я увидел небольшую ошибку в коде. В первый раз вместо profile.access использовалось использование profile.Access. Будет ли это причиной того, что поле «доступ» не находится в другом месте. - person J Bourne; 17.11.2010