В App Engine за Python възможно ли е да се запази клас с друг обект, вложен в него?

В App Engine за Python има ли нещо като Objectify (Java Library), където мога лесно да вградя клас в друг и да го запазя в хранилището за данни?

Този клас ще бъде моделиран като следния пример, където Venue съдържа обект Location. Искам да запазя това като един вложен обект, както и да мога да правя заявки по полета във вградения обект.

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

class Venue(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, така че вероятно ще го оставя да узрее, преди да го използвам, но се радвам да знам, че някой работи върху елегантно решение за това, което бих искал. Ето още информация за този проект: документи. 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)

След това, ако искате да извършвате транзакции на местоположение и място едновременно, използвайте транзакции в хранилище за данни.

РЕДАКТИРАНЕ: За да направите заявка за полета в „съдържащия се“ обект, използвайте „обратни препратки“ на хранилището за данни. т.е. фактът, че Мястото съдържа препратка към Местоположение означава, че Местоположението също съдържа препратки към Местата. Вижте: 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
Чувам те отгоре на два срещу един обект. Ако искате съвместно запитване, можете да потърсите ключа на местоположението и след това да направите заявка за места по venue.name=ABC И venue.location=location_key. Цялата концепция зад базите данни в уеб мащаб е да се върши повече работа в код, отколкото в бази данни. Следователно няма наложена референтна цялост и т.н. Това е просто избор на дизайн, който са направили в името на мащаба, който пасва на някои приложения и стилове на програмиране по-добре от други. - person vsekhar; 21.07.2011