Mongoengine提供类型Django Model的体验

来源:互联网 发布:软件音乐播放器 编辑:程序博客网 时间:2024/05/20 23:04

mongoengine

  1. 最直接的方式是使用PyMongo——MongoDB提供的Python Driver。但是用惯了Django的Model层,实在不愿意自己去维护数据库连接,写一大堆CRUD的语句。
  2. 而django-nonrel,如前所述,未必是一个好的选择。同样的原因,django-mongodb-engine是基于django-nonrel的MongoDB backend实现,也不予考虑。
  3. MongoEngine,在Django官方的支持出来之前,我认为这是最好的选择。因为MongoEngine可以提供与Django Model(ORM)非常类似的体验,可以快速上手。看一下官网首页的例子:
    复制代码
    from mongoengine import *                           # To define a schema for a                                                     # document, we create a class Metadata(EmbeddedDocument):                   # class that inherits from     tags = ListField(StringField())                 # Document.     revisions = ListField(IntField())               #                                                    # Fields are specified by class WikiPage(Document):                           # adding field objects as     title = StringField(required=True)              # class attributes to the     text = StringField()                            # document class.     metadata = EmbeddedDocumentField(Metadata)      #                                                     # Querying is achieved by >>> page.title = “Hello, World!”                    # calling the objects >>> for page in WikiPage.objects:                   # attribute on a document >>>     print page.title                            # class.       
    复制代码

Django+MongoEngine

首先安装MongoEngine(依赖pymongo)。之后在python shell中实验一下:

复制代码
from mongoengine import *connect('employeeDB')class Employee(Document):    name = StringField(max_length=50)    age = IntField(required=False)john = Employee(name="John Doe", age=25)john.save()jane = Employee(name="Jane Doe", age=27)jane.save()for e in Employee.objects.all():    print e["id"], e["name"], e["age"]
复制代码

在Django中使用也很容易,只需在models.py(如果你十分介意,也可以单独放在docs.py中)这样写:

复制代码
from mongoengine import *from mysite.settings import DBNAMEconnect(DBNAME)
class Employee(Document):    name = StringField(max_length=50)    age = IntField(required=False)
复制代码

其中,DBNAME在settings.py中指定。

然后,在视图中就可以使用“文档模型“了。

其他

1.Mongo Engine的Field类型与Django ORM的Field类型有所不同,下面是一个简单的对比:

 MongoEngineDjangoStringFieldCharFieldURLFieldURLFieldEmailFieldEmailFieldIntFieldIntegerFieldFloatFieldFloatFieldDecimalFieldDecimalFieldBooleanFieldBooleanFieldDateTimeFieldDateTimeFieldEmbeddedDocumentField--DictField--ListField--SortedListField--BinaryField--ObjectIdField--FileFieldFileField2.尽管看起来像是ORM,但MongoDB绝对不是RDB。我想MongoEngine这样的设计是为了方便上手,但是使用的时候,一定要按照NoSQL的方式去思考问题。

原创粉丝点击