2011-02-08 16 views
6

मैं एक कस्टम फ़ंक्शन बनाने की कोशिश कर रहा हूं जिसे मैं एक क्वेरीसेट "चेन" में रख सकता हूं जो क्वेरीसेट पर फ़िल्टर लागू करेगा। सामान्य Django क्वेरीसेट फ़िल्टर की तरह, यह क्वेरीसेट को इसके बाईं ओर ले जाएगा और परिणामी क्वेरीसेट को दाईं ओर पास करेगा।Django मॉडल क्वेरीसेट फ़िल्टर फ़ंक्शन के रूप में

models.MyModel.objects.all() 
models.MyModel.objects.some_manger_function() 
models.MyModel.objects.some_manger_function().count() 
models.MyModel.objects.some_manger_function().filter(title='something') 

क्वेरीसमूह श्रृंखला के लिए अपने कस्टम समारोह को जोड़ने के बाद:

क्वेरीसमूह श्रृंखला के लिए अपने कस्टम समारोह जोड़ने से पहले

models.MyModel.objects.all().my_custom_filter() 
models.MyModel.objects.some_manger_function().my_custom_filter() 
models.MyModel.objects.some_manger_function().my_custom_filter().count() 
models.MyModel.objects.some_manger_function().my_custom_filter()\ 
    .filter(title='something') 

मुझे यकीन है कि कैसे करना है मेरी समारोह के निर्माण के लिए नहीं कर रहा हूँ इस। क्या इसके आसपास किसी प्रकार के सजावट की ज़रूरत है?

???? def my_custom_filter(???): 
???? return qs.filter(id__gte=10) 

क्या कोई इसे पूरा करने के लिए एक अच्छा तरीका जानता है?

निम्नलिखित काम कर सकते हैं, लेकिन मैं कुछ और Django की तरह कुछ और उम्मीद कर रहा था।

def my_custom_filter(qs): 
    return qs.filter(id__gte=1) 

my_custom_filter(models.MyModel.objects.all()).count() 

कोई सलाह बहुत सराहना की जाती है।

धन्यवाद, जो

अद्यतन: मैं इग्नेसियो के समाधान के विवरण बाहर काम करने की कोशिश कर रहा हूँ। मैं बहुत अधिक क्वेरीसमूह तो अधिभावी मैं एक साथ piecing कर रहा हूँ कि मैं क्या ढूँढने में सक्षम हूँ के साथ नहीं किया है ...

class MyQuerySet(QuerySet): 

    def filter(self, *args, **kwargs): 
     return super(self.__class__, self).filter(*args, **kwargs).\ 
        filter(id__gt=5) 


class MyManager(models.Manager): 

    def testqs(self): 
     return MyQuerySet(self.model) 

हालांकि, मैं इस तरह से मैं उम्मीद कर रहा है नहीं लगता है। कोई सुझाव?

>>> models.MyModel.objects.testqs().filter() 

अद्यतन 2: इस लेख उपयोगी साबित हुई। http://zmsmith.com/2010/04/using-custom-django-querysets/

+0

+1 अपडेट 2 में लिंक के लिए, मुझे भी मदद मिली। –

उत्तर

4

आपको जोड़ा गया विधि के साथ QuerySet बाल वर्ग लिखने की आवश्यकता होगी, फिर use that class in the manager

+0

आपकी सलाह इग्नासिओ के लिए धन्यवाद। मैंने उपरोक्त अपडेट किए हैं। –

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