GAE/PのPolyModelの使い方

Google App EngineにはPolyModel(google.appengine.ext.db.polymodel.PolyModel)というクラスがあります。このクラスを使うと、他のクラスを継承した、データストア用のクラスを作成することができます。

また、同クラスはポリモーフィズムを持つため、メソッドをオーバーライドしておけばコード中で型の意識をする必要がなくなります(もしオーバーライドしていなければ、親クラスのメソッドが呼ばれます)。なお、試した結果、親クラスから小クラス、さらに孫クラスと、多重の継承関係を持たせることが可能でした。

例) ポリモーフィズムを使った例

class Product(polymodel.PolyModel):
    name = db.StringProperty()
    price = db.FloatProperty()

    @property
    def info(self):
        return "%(n)s – $%(p)f" % dict(n=self.name, p=self.price)


class Book(Product):
    author = db.StringProperty()

    @property
    def info(self):
        return "%(n)s(author: %(a)s) – $%(p)f" % dict(
                n=self.name, p=self.price, a=self.author)


class Comic(Book):
    publisher = db.StringProperty()

    @property
    def info(self):
        return "%(n)s(%(a)s/%(pub)s) – $%(p)f" % dict(
                n=self.name, p=self.price, a=self.author, pub=self.publisher)


class ElectricProduct(Product):
    maker = db.StringProperty()

    @property
    def info(self):
        return "%(n)s(maker: %(m)s) – $%(p)f" % dict(
                n=self.name, p=self.price, m=self.maker)


class PutProductsHandler(webapp.RequestHandler):
    def get(self):
        product = Product(key_name="product1",
                name="Normal Product",
                price=99.9)
        product.put()
        b_product = Book(key_name="product2",
                name="The story of hoge",
                price=8.2,
                author="Mr Hoge")
        b_product.put()
        e_product = ElectricProduct(key_name="product3",
                name="The fuga PC",
                price=1299.99,
                maker="Fuga corp")
        e_product.put()
        c_product = Comic(key_name="product4",
                name="The last of hoge",
                price=4.2,
                author="Unknown",
                publisher="Hoge pub")
        c_product.put()


class GetProductsHandler(webapp.RequestHandler):
    def get(self):
        p1 = Product.get_by_key_name("product1")
        p2 = Product.get_by_key_name("product2")
        p3 = Product.get_by_key_name("product3")
        p4 = Product.get_by_key_name("product4")
        logging.info("P1 INFO: %s" % p1.info)  # Write P1 INFO: Normal Product – $99.900000.
        logging.info("P2 INFO: %s" % p2.info)  # Write P2 INFO: The story of hoge(author: Mr Hoge) – $8.200000.
        logging.info("P3 INFO: %s" % p3.info)  # Write P3 INFO: The fuga PC(maker: Fuga corp) – $1299.990000
        logging.info("P4 INFO: %s" % p4.info)  # Write P4 INFO: The last of hoge(Unknown/Hoge pub) – $4.200000
        logging.info("p1 class name: %s" % p1.class_name())  # p1 class name: Product
        logging.info("p2 class name: %s" % p2.class_name())  # p2 class name: Book
        logging.info("p3 class name: %s" % p3.class_name())  # p3 class name: ElectricProduct
        logging.info("p4 class name: %s" % p4.class_name())  # p4 class name: Comic

The PolyModel Class - Google App Engine - Google Code

この記事が役に立った場合、シェアしていただけると励みになります!!