在GAE上动态创建数据库模型

标签:Google App Engine, Python

今天在GAE论坛看到一个奇怪的问题,他说他的网站要允许用户创建任意类型的模型,可以包含任意类型的属性,问怎么实现。
例如用户需要临时创建一个Book类,这个类有title、author和rating这3个参数,但程序事先是不知道的。

暂且不考虑他这样做的用意,只说这在技术上是可行的。
最容易想到的方法当然是eval,但显得不太安全,也很笨拙。
其实之前我在《Python的metaclass》里有介绍过type()和new.classobj(),它们干这种事很方便:
from google.appengine.ext import db

property = {'string': db.StringProperty, 'rating': db.RatingProperty}
Book = type('Book', (db.Model,), {'title': property['string'](), 'author': property['string'](), 'rating': property['rating']()})

new_book = Book(**{'title': 'Harry James Potter', 'author': 'Joanne Kathleen Rowling', 'rating': 100})
new_book.put()

book = Book.all().filter('title =', 'Harry James Potter').get()
print book.title
print book.author
print book.rating
其中,property是需要事先构造的,不过属性类型就那么20种左右。其他参数则都是可以从字符串构造得到的。
最终得到了这个结果:
Harry James Potter
Joanne Kathleen Rowling
100
至于Java是否能做到我就不清楚了,因为动态构造类型是动态语言的长项,静态语言想要模拟的确很难。

0条评论 你不来一发么↓

    想说点什么呢?