Google App Engine(GAE)中使用db.ReferenceProperty来处理实体之间的一对多关联,如Diary(日志)和Category(分类)是多对一的关系,可以简单配置如下:
1 2 3 4 5 6 7 8 | class Category(db.Model): name = db.StringProperty( required = True) <code> class Diary(db.Model): title = db.StringProperty( required = True ) content = db.TextProperty() category = db.ReferenceProperty(Category) </code> |
这样可以使用diary.category即可获取Diary(日志)所对应的Category(分类),使用category.diary_set即可获取Category(分类)所对应的Diary(日志)
但是再处理Tag(标签)和Diary(日志)时出现了问题,因为GAE并没有多对多关联,经过查询资料,可以有一种很简单的办法是在关系的其中一方创建一个的列表,如下:
1 2 3 4 5 6 7 8 9 10 11 12 | class Tag(db.Model): name = db.StringProperty( required = True ) diaries = db.ListProperty(db.Key) class Diary(db.Model): title = db.StringProperty( required = True ) content = db.TextProperty() category = db.ReferenceProperty(Category) @property def tags(self): return Tag.gql("WHERE diaries = :1", self.key()) |
在一篇日志(Diary)贴上标签(Tag)用如下办法即可:
1 | tag.diaries.append(diary.key()) |
获取一篇日志(Diary)的标签(Tag)用如下语句即可:
1 | diary.tags() |
这样就比较简单的实现了多对多的关联,不能不说Google的工程师真是牛逼,这种办法都可以想出来。
1 条评论 »
请教个问题:在第一种 一对多的情况下。
D = Diary()
D.title = ‘title’
D.content =’content’
D.category = 这部分怎么写?
db.put(D)
[回复]
评论 由 yangdongxing — 2010年08月2日 #