2009-12-23 13 views
6

मैं निम्नलिखित कोड है:फिल्टर करने के लिए क्वेरी सेट एक प्रबंधक लेखन परिणाम

class GroupDepartmentManager(models.Manager): 
    def get_query_set(self): 
    return super(GroupDepartmentManager, self).get_query_set().filter(group='1') 

class Department(models.Model): 
name = models.CharField(max_length=128) 
group = models.ForeignKey(Group) 
def __str__(self): 
    return self.name 
objects = GroupDepartmentManager() 

... और यह ठीक काम करता है। केवल एक चीज यह है कि मुझे को group=(the group specified by group = models.ForeignKey(Group)) के साथ प्रतिस्थापित करने की आवश्यकता है। मेरे पास यह निर्धारित करने का प्रयास करने में काफी समय है कि क्या विदेशी कुंजी को कक्षा में या get_query_set फ़ंक्शन में, या क्या हो सकता है। मुझे पता है कि आप इसे group.department_set.filter(group=desired group) के साथ पूरा कर सकते हैं, लेकिन मैं व्यवस्थापक मॉडल के लिए यह मॉडल लिख रहा हूं, इसलिए मुझे एक चर का उपयोग करने की आवश्यकता है और = चिह्न के बाद स्थिर नहीं है।

+2

मुझे समझने में कुछ परेशानी है कि आप क्या हासिल करने की कोशिश कर रहे हैं। क्या आप विभाग_instance.objects.all() को केवल विभागों को लौटा सकते हैं जो विभाग_instance के समान समूह में हैं? - मासीज Pasternacki 0 सेकंड पहले –

+0

हाँ जॉन आपका मामला स्पष्ट नहीं है। क्या परिभाषित किया गया है कि किस समूह को विभाग.objects.all() द्वारा चुना जाना है, उदाहरण के लिए? – kibitzer

+0

ठीक है, तो समूह की एक सूची है। प्रत्येक समूह में कुछ विभाग हैं। मेरे पास कुछ कर्मचारी भी हैं। प्रत्येक कर्मचारी वास्तव में एक समूह और एक विभाग से संबंधित है। जब मैं किसी कर्मचारी को संपादित करता हूं, तो विभागों की ड्रॉप-डाउन सूची डेटाबेस के सभी विभागों को दिखाती है, न कि केवल कर्मचारी के समूह में विभाग। तो, मैं केवल कर्मचारी के समूह में विभाग दिखाना चाहता हूं। मैंने सोचा कि मैं विभाग_सेट परिणामों को किसी विशेष समूह के भीतर विभागों को सीमित करके ऐसा कर सकता हूं। शायद मैं वास्तव में उलझन में हूं। लेकिन यही वह है जिसे मैं हासिल करने की कोशिश कर रहा हूं। – John

उत्तर

4

मेरे पास एक झुकाव है जो इस प्रकार objects पर डिफ़ॉल्ट Manager को प्रतिस्थापित करने का एक अच्छा विचार नहीं हो सकता है, खासकर यदि आप व्यवस्थापक साइट का उपयोग करने की योजना बना रहे हैं ... भले ही यह आपके कर्मचारियों के साथ आपकी सहायता करे, विभागों को संभालने के दौरान आप सभी की मदद नहीं करते हैं। सामान्य objects के साथ विभागों पर प्रतिबंधित दृश्य प्रदान करने वाली दूसरी संपत्ति के बारे में कैसे? या मानक Managerobjects से _objects पर ले जाएं और from_same_group से objects का नाम बदलें यदि आप वास्तव में अपने ऐप के लिए अपना मूल दृष्टिकोण पसंद करते हैं।

class Department(models.Model): 
    name = models.CharField(max_length=128) 
    group = models.ForeignKey(Group) 
    def __str__(self): 
     return self.name 
    objects = models.Manager() 

    @property 
    def from_same_group(self): 
     return Department.objects.filter(group__exact=self.group) 

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


संपादित करें: ठीक है, यह और अधिक स्पष्ट बनाने के लिए:

class Department(models.Model): 
    name = models.CharField(max_length=128) 
    group = models.ForeignKey(Group) 
    def __str__(self): 
     return self.name 

    _objects = models.Manager() 

    @property 
    def objects(self): 
     # note the _objects in the next line 
     return Department._objects.filter(group__exact=self.group) 
+0

मुझे डर है कि मेरे पास कोई सुराग नहीं है। मैंने_same_publisher से from_same_group में बदल दिया। लेकिन क्या मैं ऑब्जेक्ट्स = from_same_publisher() नहीं कहना चाहूंगा? – John

+0

ओच, प्रकाशक बिट उस स्थान से आता है जहां मैंने समान कोड का उपयोग किया ... वैसे भी, मैं चीजों को और स्पष्ट करने के लिए संपादित करूंगा। –

+0

धन्यवाद, लेकिन मैंने इसे विभाग वर्ग में जोड़ा, और चयन बॉक्स अभी भी सभी विभाग वस्तुओं को दिखा रहा है। मुझे लगता है कि जैसा कि आपने इंगित किया है, मुझे अभी भी व्यवस्थापक पृष्ठ सेट अप करना होगा, इस सेटअप का लाभ उठाएं। मैं उलझन में हूं क्योंकि मैंने सोचा था कि सभी प्रबंधक व्यवसाय models.py के अंदर होता है, admin.py में बदलाव किए बिना। – John

2

आप पुनर्विचार करने के लिए चाहते हो सकता है: यदि आप बिल्कुल objects की जगह पर जोर देते हैं, तो आप शायद ऐसा करना चाहते हैं चाहते हैं यदि आप पाते हैं कि कस्टम मैनेजर बनाने की कोशिश करना बहुत जटिल है तो समूहों और विभागों के बीच संबंध बहुत जटिल है। प्रबंधक सामान्य प्रश्नों को सरल बनाने में उत्कृष्टता प्राप्त करते हैं, लेकिन मॉडल और मॉडल के उदाहरणों के बीच जटिल संबंधों को प्रदर्शित करने में फ्लाप करते हैं।

हालांकि, मुझे लगता है कि यह आलेख filtering model objects with a custom manager आपको सही दिशा में इंगित करेगा। लेखक एक फ़ंक्शन कॉल करने के लिए एक तकनीक का प्रस्ताव देता है जो एक अनुकूलित प्रबंधक क्लास देता है जिसमें आपके द्वारा क्लास में सहेजे गए फ़िल्टर पैरामीटर होते हैं, इसलिए वे उदाहरण में पास नहीं होते हैं। कर दो!

+0

ग्रेट लिंक, धन्यवाद। यह निश्चित रूप से एक हैक है, लेकिन मैं इसे आजमाउंगा और रिपोर्ट करूंगा। – John

+0

कोई रास्ता नहीं! यह एक हैक होने के लिए बहुत गतिशील तरीका है! मुझे वास्तव में लगता है कि यह काफी चालाक है। – jathanism

+0

पर्याप्त मेला! मैंने इसे विभाग वर्ग में "ऑब्जेक्ट्स = get_filter_manager (समूह = समूह)" के साथ कार्यान्वित किया और मुझे एक ही ठोकरें ब्लॉक प्राप्त हुआ जिसे मैंने हमेशा पहले प्राप्त किया है: "str 'ऑब्जेक्ट में कोई विशेषता' creative_counter 'नहीं है। मुझे इंडेंट को कोड प्राप्त नहीं हो रहा है, या मैं इसे सब यहां पोस्ट करूंगा। – John

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