Можно ли в App Engine для Python сохранить класс с другим вложенным в него объектом?

Есть ли в App Engine для Python что-нибудь вроде Objectify (Java Library), где я могу легко встроить класс в другой и сохранить его в хранилище данных?

Этот класс будет смоделирован, как в следующем примере, где Venue содержит объект Location. Я хочу сохранить это как один вложенный объект, а также иметь возможность запрашивать по полям во встроенном объекте.

Местоположение класса ():
city = db.StringProperty ()
state = db.StringProperty ()

Место проведения класса (db.Model):
name = db.StringProperty ()
location = Location ()

Вот информация о том, как это работает в Objectify в App Engine для Java.
http://code.google.com/p/objectify-appengine/wiki/IntroductionToObjectify#@Embedded

Возможно ли это с использованием Python?


person Sam Edwards    schedule 19.07.2011    source источник


Ответы (2)


В настоящее время нет, но библиотека NDB поддерживает встраивание моделей друг в друга либо путем сериализации их как буферы протокола, или путем вложения их свойств (мода Objectify).

person Nick Johnson    schedule 20.07.2011
comment
Спасибо! Этот проект пытается сделать то, что я искал. StructuredProperty: свойство, которое позволяет вам включать один тип модели в другой, по значению. Похоже, что оно все еще находится на ранней стадии, и я новичок в среде выполнения Python, поэтому я, вероятно, позволю ему созреть, прежде чем я закончу его использовать. но я рад узнать, что кто-то работает над элегантным решением того, что я хотел бы. Дополнительная информация об этом проекте: Docs. google.com/document/d/ - person Sam Edwards; 20.07.2011

Рассмотрите возможность использования свойств ссылки. Т.е. сохранить объект Location как отдельный объект и включить это местоположение в объект Venue посредством ссылки.

class Location():
  city = db.StringProperty()
  state = db.StringProperty()

class Venue(db.Model):
  name = db.StringProperty()
  location = db.ReferenceProperty(Location)

Затем, если вы хотите одновременно совершать транзакции в Location и Venue, используйте транзакции хранилища данных.

РЕДАКТИРОВАТЬ: Чтобы запросить поля в «содержащемся» объекте, используйте «обратные ссылки» хранилища данных. Т.е. тот факт, что Venue содержит ссылку на Location, означает, что Location также содержит ссылки на Venue. См.: http://code.google.com/appengine/docs/python/datastore/datamodeling.html#References

person vsekhar    schedule 19.07.2011
comment
Спасибо @vsekhar, я подумал об этом, и он достигнет желаемой функциональности, но у него есть недостатки. 1. Я должен поддерживать ссылки между двумя объектами. 2. У меня было бы два объекта в базе данных, тогда как по логике мне нужен только один. 3. При желании я не смог запросить как name, так и location.name, потому что они принадлежат к разным объектам. 4. Это не позволило бы мне легко сериализоваться во вложенную структуру JSON, которую я хотел бы. 5. Я знаю, что такая концепция вложенности свойств возможна (по крайней мере, логически) в Java App Engine с Objectify, поэтому мне нужна такая простота. - person Sam Edwards; 20.07.2011
comment
Я слышу вас о двух объектах против одного. Если вам нужен совместный запрос, вы можете найти ключ местоположения, а затем запросить объекты по месту проведения. Name = ABC AND location.location = location_key. Вся концепция баз данных веб-масштаба заключается в том, чтобы выполнять больше работы в коде, чем в базах данных. Следовательно, нет принудительной ссылочной целостности и т. Д. Это просто выбор дизайна, который они сделали ради масштабирования, который лучше подходит одним приложениям и стилям программирования, чем другим. - person vsekhar; 21.07.2011