Mongopie,Mongodb的python object mapping

MongoPie是个轻量级的开源python mongodb mapping. 目的是使用Object-Relational Mapping 类似的技术简化mongodb的编程,可以通过继承Model来实现mongodb 的schema.

比如,我们要实现一个简单的标签系统,首先定义Model

class UserTag(mongopie.Model):
''' 用户的标签云 '''
user = mongopie.StringField()
tag = mongopie.StringField()
count = mongopie.IntegerField(default=0)

class Vote(mongopie.Model):
''' 一次投票,voter在created_at时间给votee的tag标签投了一票'''
voter = mongopie.StringField()
votee = mongopie.StringField()
tag = mongopie.StringField()
created_at = mongopie.DateTimeField(auto_now=True)



定义好Model后,可以通过方法实现两个类的关联,Vote对象有个on_created方法, 在每个Vote对象被创建并放在数据库后会自动调用. 重载此方法

class UserTag(mongopie.Model):
......
@classmethod
def add_tag(cls, vote):
ut = cls.find_one(user=vote.votee,
tag=vote.tag)
if not ut:
ut = cls()
ut.user = vote.votee
ut.tag = vote.tag
ut.count += 1
ut.save()
return ut

class Vote(mongopie.Model):
......
def on_created(self):
UserTag.add_tag(self)


这样每当一个投票产生后,UserTag对应的count会加一.


def make_vote(voter, votee, tag):
v = Vote()
v.voter = voter
v.votee = votee
v.tag = tag
v.save()
return v

def test():
# Tom 给Jack的hacking 投了一票
make_vote('Tom', 'Jack', 'Hacking')
# Jerry 给Jack的Food 投了一票
make_vote('Jerry', 'Jack', 'Food')
# Jerry 也给Jack的Hacking投了一票
make_vote('Jerry', 'Jack', 'Hacking')

for ut in UserTag.find(user='Jack'): # 找出Jack所有的投票
print ut.get_dict()

#输出结果是
{'count': 2, '_id': ObjectId('4eecbce5347307034e000001'), 'tag': u'Hacking', 'user': u'Jack'}
{'count': 1, '_id': ObjectId('4eecbce5347307034e000003'), 'tag': u'Food', 'user': u'Jack'}



完整的实例请看 mongopie_test.py

开源项目地址在 [url]https://github.com/superisaac/mongopie[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值