没有比人更高的山

Google App Engine中的多对多关联

Google App Engine中的多对多关联5.5102

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的工程师真是牛逼,这种办法都可以想出来。

VN:F [1.7.5_995]
Rating: 5.5/10 (2 votes cast)
VN:F [1.7.5_995]
Rating: +1 (from 1 vote)

1 条评论 »

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

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

    UN:F [1.7.5_995]
    Rating: 0.0/5 (0 votes cast)
    UN:F [1.7.5_995]
    Rating: 0 (from 0 votes)

    [回复]

    评论 由 yangdongxing — 2010年08月2日 #

发表评论:

Switch to our mobile site