在GAE的数据库中实现多对多的关系

标签: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()

3条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?