在GAE的数据库中实现多对多的关系
2009 3 1 12:50 PM 2431次查看
分类:Google App Engine 标签:Google App Engine, Python
英文版:http://code.google.com/appengine/articles/modeling.html
中文版:http://www.cnblogs.com/kuber/archive/2008/08/19/ModelingEntityRelationshipsInGAE.html
大部分内容来自这个简单的版本:
http://www.zhlwish.com/blog/diary/agd6aGx3aXNocgwLEgVEaWFyeRiZEQw/
之前我曾写了如何实现一对一和一对多关系,方法就是使用db.ReferenceProperty,例如:
class Category(db.Model):
name = db.StringProperty( required = True)
class Diary(db.Model):
title = db.StringProperty( required = True )
content = db.TextProperty()
category = db.ReferenceProperty(Category)
这样每篇日记(Diary)都有一个分类(Category)属性。我们只要用diary.category,就能获取日记的分类;而用category.diary_set(在前面的文档有介绍),就能获取该分类下的日记。
多对多的实现其实也很简单,在其中一方增加一个db.ListProperty,其中的值为db.Key即可(即一个db.Key的列表)。
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())
这样一来,想为日记增加一个标签(Tag),只要调用list的方法即可:tag.diaries.append(diary.key())。而获取一篇日记的标签则用diary.tags()。
向下滚动可载入更多评论,或者点这里禁止自动加载。