2011-04-16 22 views
27

के आधार पर क्वेरी मैं एक समारोह मेरी Django मॉडल वर्ग में बनाया गया है और मुझे लगता है कि समारोह का उपयोग करने के मेरी क्वेरी परिणामों को फ़िल्टर करना चाहते हैं।Django: फ़िल्टर कस्टम समारोह

class service: 
     ...... 
     def is_active(self): 
      if datetime.now() > self.end_time: 
        return False 
      return True 

अब मैं की तरह

nserv = service.objects.filter(is_active=True) 

मैं जानता हूँ कि मेरी क्वेरी फिल्टर, कुछ में इस सुविधा का उपयोग करना चाहते हैं, इस सरल 'is_active' मामले के लिए, मैं सीधे फिल्टर क्वेरी में इस तुलना कर सकते हैं, लेकिन अधिक जटिल परिस्थितियों के लिए, यह संभव नहीं हो सकता है। कस्टम फ़ंक्शंस के आधार पर, मुझे क्वेरी कैसे करनी चाहिए?

+3

वैसे, आप 'कर सकता है datetime.now वापसी() <= self.end_time' :-) – Rikki

+0

मैं बिल्कुल वैसा ही समस्या थी! यहां तक ​​कि समारोह को भी –

उत्तर

17

मैं इस तरह आप इस्तेमाल कर सकते हैं अपने वर्ग के लिए एक कस्टम प्रबंधक का उपयोग करने के लिए आपको सुझाव है, जैसे:

class ServiceManager(models.Manager): 
    def are_active(self): 
     # use your method to filter results 
     return you_custom_queryset 

custom managers

+20

'# परिणामों को फ़िल्टर करने के लिए अपनी विधि का उपयोग करें 'सवाल यह है कि प्रश्न पूछ रहा है कि कैसे कर। –

+0

@Ignacio - वास्तव में इस समाधान के रूप में मुझे अच्छी तरह से सूट। इसलिए मैं कुछ अलग करने की कोशिश करने के लिए इसके साथ जाऊंगा। – Neo

16

आप सक्षम नहीं हो सकते हैं, इसके बजाय आप list comprehension या generator expression के साथ क्वेरीसेट को पोस्ट-प्रोसेस कर सकते हैं।

उदाहरण के लिए:

nserv = service.objects.are_active()

यह कुछ के साथ प्राप्त किया जाएगा:

[x for x in Q if x.somecond()] 
+3

कहा जाता था एलसी/जीनेक्स क्या है? – Neo

+6

नियंत्रण रेखा = [सूची समझ] (http://docs.python.org/tutorial/datastructures.html#list-comprehensions)। Genex = [जनरेटर अभिव्यक्ति] (http://docs.python.org/reference/expressions.html#generator-expressions) –

+0

@A ली -: पी मैं अभी भी अजगर शब्दावली में गति अप करने के लिए नहीं मिला है। – Neo

13

देखें मैं सिर्फ एक समान समस्या हुई। समस्या यह थी कि मुझे एक क्वेरीसेट उदाहरण वापस करना पड़ा। मेरे लिए एक त्वरित समाधान की तरह कुछ करने के लिए किया गया था:

active_serv_ids = [service.id for service in Service.objects.all() if service.is_active()] 
nserv = Service.objects.filter(id__in=active_serv_ids) 

यकीन है कि यह यह करने के लिए सबसे सुंदर और performant तरीका नहीं है, लेकिन मैं मेरे लिए काम करता है।

ऐसा करने का एक और अधिक वर्बोज़ तरीका होगा:

active_serv_ids = [] 

for service in Service.objects.all(): 
if service.is_active(): 
    active_serv_ids.append(service.id) 

nserv = Service.objects.filter(id__in=active_serv_ids) 
+0

धन्यवाद यह सही है। यह अभी तक "परिणाम लोड करने" और क्लाइंट साइड फ़िल्टरिंग करने के लिए django की एक विशेषता नहीं है, इसलिए यह एकमात्र तरीका है। – beiller

4

इग्नेसियो द्वारा जवाब दिलचस्प है, लेकिन यह एक क्वेरीसमूह वापस नहीं करता है। यह एक करता है:

def users_by_role(role): 
    users = User.objects.all() 
    ids = [user.id for user in users if user.role == role] 
    return users.filter(id__in=ids) 
संबंधित मुद्दे