2013-02-09 4 views
1

Я относительно новичок в Python, исходящий из мира PHP. В PHP я бы регулярно извлекал строку, которая соответствовала бы и объекту из базы данных, скажем, Пользователь, и добавляла бы к ней свойства перед передачей объекта пользователя на мою страницу просмотра. Например, у пользователя есть адрес электронной почты, имя и идентификатор. Я получаю 5 пользователей из базы данных и в цикле for, я назначаю динамическое свойство пользователю, скажем, изображение.Добавление динамических свойств к объекту хранилища данных

Это, похоже, не работает в моделях хранилища данных Python/Google App Engine (я думаю, что он должен делать больше с моделью хранилища данных, чем python) в цикле for. Он работает в цикле for (это означает, что я могу ссылаться на user.image в цикле for, но как только цикл for заканчивается, все объекты, похоже, больше не имеют нового изображения атрибутов.

Вот пример кода:

# Model 
Class User(ndb.Model): 
    email = ndb.StringProperty() 
    name = ndb.StringProperty() 


# And then a function that returns a list of users 
users = User.get_users() 

user_list = [] 
# For loop 
for user in user: 
    # For example, get image 
    user.image = Image.get_image(user.key) 
    user_list.append(user) 

    # If I print or log this user in the for loop, I see a result 
    logging.info(user.image) # WORKS! 

for ul in user_list: 
    print ul.image # Results in None/ATTR Error 

может кто-нибудь объяснить мне, почему это происходит и как достичь этой цели?

Я искал формы, но я не мог найти что-нибудь.

+0

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

+0

get_users(), вероятно, является запросом, и в этом случае второй цикл будет обновлять пользователей без динамических свойств. –

+0

Даниэль, ты прав! Моя ошибка, ребята, я печатал весь объект и по какой-то причине (возможно, вы можете это объяснить), распечатываются только исходные свойства. Однако, если я делаю прямой вызов динамическому свойству, например, выше (print ul.image), он работает. Сожалею! – kevin

ответ

0

Попробуйте использовать Expando Model

Иногда вы не хотите объявлять свои свойства раньше времени. A подкласс специальной модели, Expando, изменяет поведение его объектов , так что любой присвоенный атрибут (пока он не начинается с знака ) сохраняется в хранилище данных.

+0

Спасибо, Шей, это возможное решение и, возможно, станет лучшим. Тем не менее, мое понимание класса Expando больше для размещения динамических свойств в хранилище данных, чем добавление свойств для отображения на страницах просмотра, правильно? – kevin

+0

Я стараюсь избегать использования Expando для классов, которые не нуждаются в нем с точки зрения хранилища данных (во избежание риска случайного размещения свойств для объектов, которые не должны иметь их) – kevin

Смежные вопросы