2015-07-22 121 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)