2011-09-14 19 views
7

मैं पाइथन और डीजेगो दोनों के लिए काफी नया हूं और जहां संभव हो वहां सर्वोत्तम प्रथाओं का पालन करना चाहता हूं। मैं काम करने में आसान बनाने के लिए निम्नलिखित कोड को व्यवस्थित करना चाहता हूं।Django - एक दृश्य, एकाधिक यूआरएल?

मैं एक ऐसा दृश्य स्थापित करने की कोशिश कर रहा हूं जिसे एकाधिक यूआरएल के माध्यम से एक्सेस किया जा सके जो विभिन्न पैरामीटर प्रदान करते हैं जिसके लिए एक क्वेरीसेट लौटाया जाएगा और प्रदर्शित किया जाएगा।

मैं निम्न URL की स्थापना की है:

url(r'^myrecords/$', login_required(RecordListView.as_view()), {'filter': 'all'}, name='myrecords'), 
    url(r'^myrecords/page(?P<page>[0-9]+)/$', login_required(RecordListView.as_view()), {'filter': 'all'}, name='myrecords'), 
    url(r'^myrecords/(?P<year>\d{4})/$', login_required(RecordListView.as_view()), {'filter': 'year'}, name='myrecords'), 
    url(r'^myrecords/last(?P<months>[0-9]{1,2})months/$', login_required(RecordListView.as_view()), {'filter': 'month'}, name='myrecords'), 

तो मेरे विचार में मैं कुछ इस तरह (वास्तव में कई अन्य पैरामीटर रहे हैं लेकिन इन URL दर्ज किया की परवाह किए बिना ही रहना चाहिए।) है:

def get_queryset(self): 
    if (self.kwargs['filter'] == 'month'): 
     x_months_ago = (datetime.date.today() - 
     datetime.timedelta(int(self.kwargs['months']) * 365/12)) 
     queryset = Record.objects.filter(user=self.request.user, 
     date__gte = x_months_ago.isoformat()) 
    elif (self.kwargs['filter'] == 'year'): 
     queryset = Record.objects.filter(user=self.request.user, date__year=self.kwargs['year']) 
    else 
     queryset = Record.objects.filter(user=self.request.user) 

यह मेरे लिए बहुत गन्दा लगता है। क्या वैसे भी मैं इसे क्लीनर बना सकता हूं? क्या फ़िल्टर पैरामीटर को किसी प्रकार की डेटा स्ट्रक्चर में रखना संभव है और फिर उन्हें पूरी चीज को कई बार लिखने के बजाय, Record.objects.filter लाइन पर भेज दें?

किसी भी सलाह की सराहना की जाएगी।

धन्यवाद।

उत्तर

6

निश्चित रूप से।

my_queryset_filters = { 
    'user': self.request.user, 
    'date__year': self.kwargs['year'], 
} 

Record.objects.filter(**my_queryset_filters) 

** कीवर्ड तर्क में शब्दकोश का विस्तार: आप एक शब्दकोश का उपयोग कर सकते हैं। (* भी है जो स्थितित्मक तर्कों में एक सूची फैलाता है।)

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