2015-07-22 116 views
1

我正在使用Django和MongoDB构建一个网站。有两种流行的API框架可用于连接DjangoMongoDB,一个是mongoengine,另一个是django-mongodb-engine在django中直接使用pymongo

由于最新的mongoengine不支持Django Documentdjango-mongodb-engine需要另一个django-nonrel包,这使得开发环境有点复杂。

我想知道,如果我可以使用Pymongo直接连接DjangoMongoDB

有没有人可以分享相同的经验?以及如何在Django中设置setting.py中的数据库以使db公开?

+0

Mongoengine 0.9可以成为Django的一个选项(假设你没有依赖0.10版本中的某些功能/增强功能)。阅读[docs](http://docs.mongoengine.org/en/latest/apireference.html)以连接到mongodb。 –

回答

2

我目前正在研究一个非常类似的问题。

你是对的,mongoengine不支持Django,但据我所知,pymongo也不支持它。至少有mongoengine有计划支持它的某一天。如果你熟悉Django,它有类似于模型的东西 - 文档。他们很容易处理 - 这实际上是一个完整的工作ORM。如果您打算构建一个大型的可重用应用程序,那么您不会得到这个结果,您最终会自己编写ORM或者有意大利细面条代码。这是我使用mongoengine的原因。

在你settings.py你应该包括下面的代码:

from mongoengine import connect 
connect('your_database') 

如果你仍然想使用pymongo出于某种原因,你的代码应该是这样的:

from pymongo import MongoClient 
client = MongoClient() 
+0

谢谢。如果我使用pymongo解决方案,'client'会成为Django中的全局变量吗? –

+0

完全取决于你自己决定 - 我假设你将用它来做一些低级别的事情,这取决于你需要什么 –

4

你可以使用pyMongo像以下代码

from pymongo import MongoClient 


class MongoConnection(object): 

    def __init__(self): 
     client = MongoClient('localhost', 27017) 
     self.db = client['database_name'] 

    def get_collection(self, name): 
     self.collection = self.db[name] 

我们创建根据我们的需要建立连接。

class MyCollection(MongoConnection): 

    def __init__(self): 
     super(MyCollection, self).__init__() 
     self.get_collection('collection_name') 

    def update_and_save(self, obj): 
     if self.collection.find({'id': obj.id}).count(): 
      self.collection.update({ "id": obj.id},{'id':123,'name':'test'}) 
     else: 
      self.collection.insert_one({'id':123,'name':'test'}) 

    def remove(self, obj): 
     if self.collection.find({'id': obj.id}).count(): 
      self.collection.delete_one({ "id": obj.id}) 

现在你只需要像下面这样打电话。

my_col_obj = MyCollection() 
obj = Mymodel.objects.first() 
my_col_obj.update_and_save(obj) 
my_col_obj.remove(obj)