Google App Engine中的多对多关联

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. 彩色标签云的生成方法
  2. Google App Engine中开发中复用Django的syndication生成RSS

One thought on “Google App Engine中的多对多关联

  1. 请教个问题:在第一种 一对多的情况下。

    D = Diary()
    D.title = ‘title’
    D.content =’content’
    D.category = 这部分怎么写?
    db.put(D)

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">