2011-11-23 20 views
5

मैं this page पढ़ा लेकिन जिसके लिए मैं MongoDB.In मेरी models.py फ़ाइल उपयोग कर रहा हूँ जब सुविधा embedding और जब linking.I उपयोग करने के लिए Django में एक परियोजना है उपयोग करने के लिए नहीं मिला मैं निम्नलिखित मॉडल:एम्बेड करने के लिए और कब लिंक करने के लिए MongoDB.when में वीएस लिंकिंग एम्बेड करना?

class Projects(models.Model): 
    projectName =models.CharField(max_length = 100,unique=True,db_index=True) 
    projectManager = EmbeddedModelField('Users') 

class Teams(models.Model): 
    teamType = models.CharField(max_length =100) 
    teamLeader = EmbeddedModelField('Users') 
    teamProject = EmbeddedModelField('Projects') 
    objects = MongoDBManager() 

class Users(models.Model): 
    name = models.CharField(max_length = 100,unique=True) 
    designation = models.CharField(max_length =100) 
    teams = ListField(EmbeddedModelField('Teams')) 



class Tasks(models.Model): 
    title = models.CharField(max_length = 150) 
    description = models.CharField(max_length=1000) 
    priority = models.CharField(max_length=20) 
    Status = models.CharField(max_length=20) 
    assigned_to = EmbeddedModelField('Users') 
    assigned_by = EmbeddedModelField('Users') 
    child_tasks = ListField() 
    parent_task = models.CharField(max_length = 150) 

मेरा सवाल यह है कि अगर हम एम्बेडिंग करते हैं तो हमें ऑब्जेक्ट को सभी मॉडलों में अपडेट करना होगा। जैसे कि मैं 'उपयोगकर्ता' का नाम अपडेट करना चाहता हूं, मुझे मॉडल के लिए अपडेट चलाने होंगे: परियोजनाएं, टीम, उपयोगकर्ता और कार्य या मेरे मामले में लिंकिंग बेहतर होगा?

उत्तर

3

सबसे पहले, अवधारणात्मक रूप से, अपने मॉडल वर्गों को एकवचन वस्तुओं के रूप में नाम दें।

उपयोगकर्ताओं के पास उपयोगकर्ता होना चाहिए, टीम टीम होना चाहिए ...

ढालना जो एक से अधिक ऑब्जेक्ट बनाया जाएगा के रूप में मॉडल के Think। उपयोगकर्ता मॉडल उत्पाद उपयोगकर्ता होगा और उपयोगकर्ताओं नामक तालिका में संग्रहीत किया जाएगा जहां प्रत्येक दस्तावेज़/पंक्ति उपयोगकर्ता ऑब्जेक्ट है।

अब, आपके प्रश्न के संबंध में, हिमलोथ बिल्कुल सही है। इसे एम्बेडेड के बजाय दस्तावेज़ के संदर्भ में लाने का तरीका उन विशेष फ़ील्ड को उपयोगकर्ता के संग्रह में किसी उपयोगकर्ता की आईडी के संदर्भ में बदलना है। इस तरह आप उपयोगकर्ता दस्तावेज़ की एक प्रति के बजाय लुकअप करने के लिए सिर्फ एक आईडी संग्रहीत कर रहे हैं। जब आप संदर्भ दस्तावेज़ बदलते हैं, तो यह उन सभी स्थानों में भी बदला जाएगा जिन्हें संदर्भित किया गया है। (विशिष्ट संबंधपरक संघ)

मुझे इसके लिए Django-mongoDB में कोई फ़ील्ड नहीं दिखाई दिया था, लेकिन शायद आप इस उद्देश्य के लिए पारंपरिक django ForeignKey फ़ील्ड का उपयोग कर सकते हैं। मुझे नहीं पता कि क्या आप मिश्रण कर सकते हैं और मैच कर सकते हैं ताकि इसे एक शॉट दें।

उदाहरण के लिए, अपनी टीम वर्ग इस तरह एक क्षेत्र होगा:

teamLeader = ForeignKey(User) 

मुझे पता है कि अगर काम करता है।

4

आपके उदाहरण में, हाँ, उपयोगकर्ता के नाम को बदलने का तात्पर्य है कि यदि आप एम्बेडिंग का उपयोग करते हैं तो आपको एक अतिरिक्त चरण के साथ अन्य सभी दस्तावेज़ अपडेट करना होगा। आपकी स्थिति में अधिक उपयुक्त क्या है (संदर्भ)। इसमें क्वेरी समय पर एक अतिरिक्त कदम शामिल है, लेकिन आपके विशेष "व्यावसायिक तर्क" के कारण, यह बेहतर है।

आम तौर पर, यदि किसी दिए गए दस्तावेज़ को कई अलग-अलग स्थानों से एक्सेस करने की आवश्यकता होती है तो इसे एम्बेडेड के बजाय संदर्भ बनाने के लिए समझदारी होती है। जब दस्तावेज़ अक्सर बदलता है तो वही स्थितियों में लागू होता है।

+0

क्या आप मुझे एक उदाहरण दिखा सकते हैं? मैं आपका आभारी रहूंगा :) – Anshul

+0

बस अपने सभी एंबेडेड मॉडेलफ़िल्ल्ड ('उपयोगकर्ता') को संदर्भ फ़ील्ड ('उपयोगकर्ता') के साथ बदलें। – hymloth

+0

लेकिन मैं Django-mongoDB इंजन का उपयोग कर रहा हूं और इसमें संदर्भ फ़ील्ड जैसी कोई फ़ील्ड नहीं है। :( – Anshul

संबंधित मुद्दे