दूसरा विकल्प है कि यदि आप एक फिल्टर है कि आप हमेशा लागू करना चाहते हैं, प्रश्न में मॉडल जो हमेशा फिल्टर करने के लिए परिणाम नहीं दिए लागू होता है पर एक custom manager जोड़ना है।
इस का एक अच्छा उदाहरण एक Event
मॉडल है, जहां प्रश्नों का 90% के लिए आप मॉडल आप Event.objects.filter(date__gte=now)
की तरह कुछ चाहते करने जा रहे हैं पर करते है, यानि कि आप सामान्य रूप से Events
में रुचि आगामी रहे हैं कि कर रहे हैं। यह दिखाई देगा:
class EventManager(models.Manager):
def get_query_set(self):
now = datetime.now()
return super(EventManager,self).get_query_set().filter(date__gte=now)
और मॉडल में:
class Event(models.Model):
...
objects = EventManager()
लेकिन फिर से, इस Event
मॉडल पर किया सभी डिफ़ॉल्ट प्रश्नों के खिलाफ एक ही फिल्टर लागू होता है और इतनी के रूप में से कुछ लचीला नहीं है ऊपर वर्णित तकनीकें।
from django import template
register = template.Library()
@register.assignment_tag
def query(qs, **kwargs):
""" template tag which allows queryset filtering. Usage:
{% query books author=author as mybooks %}
{% for book in mybooks %}
...
{% endfor %}
"""
return qs.filter(**kwargs)
के लिए धन्यवाद django डिजाइन अवधारणा के स्पष्टीकरण। मैं मॉडल विधि दृष्टिकोण का उपयोग कर रहा हूं। – Ber
हैलो लोग 2014 अब है! लगभग 6 साल बाद जेएस पुस्तकालयों ने बड़ी प्रगति की है, और कुछ अच्छी जावा स्क्रिप्ट लाइब्रेरी, या कम से कम AJAX-ed के समर्थन के साथ क्लाइंट पक्ष पर डेटा की अत्यधिक मात्रा में फ़िल्टर नहीं किया जाना चाहिए। – andi
@andi: मैं निश्चित रूप से यहां तक कि मामूली बड़े डेटा सेट के लिए भी सहमत हूं, उदा। एक मेज में भी हजारों पंक्तियां। लाखों पंक्तियों के साथ डेटाबेस पर काम करने के बाद, निश्चित रूप से सर्वर-साइड फ़िल्टरिंग के लिए निश्चित रूप से एक जगह है :) –