没有比人更高的山

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)

No Comments yet »

发表评论:

Switch to our mobile site