Обновление модели на сервере хранилища данных 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=[]
@ Роберт надеюсь, что с форматированием сейчас все в порядке.
Спасибо, Саи Кришна
2 ответа
Мы смогли это исправить. Проблема была в объекте users.User, который не добавляет @gmail.com для пользователей gmail, но принимает другие домены с именем домена, который выбрасывал объект None Type.
Еще раз спасибо за помощь
Когда вы добавляете свойство в модель, существующие экземпляры модели, находящиеся в хранилище данных, не получают это свойство автоматически.
Вам нужно будет изменить код вашего обработчика, который взаимодействует с сущностями профиля, чтобы проверить наличие доступа. Питона 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.