В соответствии с рекомендациями @mjhm и @Nick, я подклассифицировал ListProperty для принятия любого класса. Я загрузил универсальную версию в GitHub с именем ObjectListProperty. Я использую его как более чистую альтернативу использованию параллельных ListProperty.
ObjectListProperty прозрачно сериализует / десериализует при получении и размещении модели. Он имеет внутренний метод сериализации, который работает для простых объектов, но может обрабатывать более сложные объекты, если они определяют свой собственный метод сериализации. Вот тривиальный пример:
from object_list_property import ObjectListProperty
class Animal():
""" A simple object that we want to store with our model """
def __init__(self, species, sex):
self.species = species
self.sex = sex if sex == 'male' or sex == 'female' else 'unknown'
class Zoo(db.Model):
""" Our model contains of list of Animal's """
mammals = ObjectListProperty(Animal, indexed=False)
class AddMammalToZoo(webapp.RequestHandler):
def post(self):
# Implicit in get is deserializing the ObjectListProperty items
zoo = Zoo.all().get()
animal = Animal(species=self.request.get('species'),
sex=self.request.get('sex') )
# We can use our ObjectListProperty just like a list of object's
zoo.mammals.append(animal)
# Implicit in put is serializing the ObjectListProperty items
zoo.put()