2012-09-29 18 views
11

मैं फ़िल्टर के एक सेट का उपयोग करके अपने डेटाबेस से पंक्तियों का एक गुच्छा पुनर्प्राप्त करना चाहता हूं।django सशर्त रूप से फ़िल्टरिंग ऑब्जेक्ट्स

मैं सोच रहा था कि अगर सशर्त फ़िल्टर django में लागू होता है। यही है, "फ़िल्टर अगर वैरिएबल कोई नहीं है, या अन्यथा फ़िल्टरिंग लागू नहीं है"।

कुछ इस तरह:

user = User.objects.get(pk=1) 
category = Category.objects.get(pk=1) 
todays_items = Item.objects.filter(user=user, date=now()).conditional_filter(category=category)) 

मुझे क्या करना चाहते हैं श्रेणी फिल्टर लागू केवल तभी श्रेणी कोई भी नहीं है।

यदि श्रेणी कोई नहीं है (इसका मतलब है कि यह अनुरोध ऑब्जेक्ट में नहीं दिया गया है) तो यह फ़िल्टर बिल्कुल लागू नहीं होगा। यह मुझे 'if-elif-else' स्थितियों का एक गुच्छा बचाएगा।

क्या ऐसा करने का कोई तरीका है?

उत्तर

15

आप श्रृंखला प्रश्नों कर सकते हैं:

user = User.objects.get(pk=1) 
category = Category.objects.get(pk=1) 
qs = Item.objects.filter(user=user, date=now()) 
if category: 
    qs = qs.filter(category=category) 

क्वेरीसमूह lazily क्रियान्वित कर रहे हैं के रूप में, डीबी हिट केवल तब होगा जब आप आइटम प्रदर्शित करते हैं।

2

वे आपके मुद्दे के लिए कई दृष्टिकोण हैं। एक दृष्टिकोण इस उदाहरण के साथ आप आसानी से अपने खुद क्वेरी रचना कर सकते हैं Complex lookups with Q objects

from django.db.models import Q 

user = User.objects.get(pk=1) 
category = Category.objects.get(pk=1) 

f1 = Q(user=user, date=now()) 
f_cat_is_none = Q(category__isnull = True) 
f_cat_is_not_none = Q(category=category) 

todays_items = Item.objects.filter(f1 & (f_cat_is_none | f_cat_is_not_none)) 

साथ खेलने के लिए मैं सही अपने जवाब में समझ में नहीं आता है, तो इस प्रश्न के लिए आप देख रहे है, लेकिन,।

संपादित वजह से ओ पी टिप्पणी

category__isnull == True मतलब है कि, डेटाबेस में, आइटम एक संबद्ध श्रेणी नहीं है। शायद क्वेरी लिए आप देख रहे है:

from django.db.models import Q 

user_pk = 1 
category_pk = 1 #some times None 

f = Q(user__pk = user_pk, date=now()) 
if category_pk is not None: 
    f &= Q(category__pk = category_pk) 

todays_items = Item.objects.filter(f ) 

यह केवल एक कोड नमूना है, अपनी आवश्यकताओं के फिट। एकल _ और डबल __ से सावधान रहें।

+0

धन्यवाद, जो मुझे समझ में नहीं आता है वह 'category__isnull = True' है। मेरी वस्तुओं में से कोई भी अपने वर्ग क्षेत्र में न्यूल नहीं है। जो इसे हमेशा झूठा बना देता है। – xpanta

+0

@xpanta, उत्तर पर समझाया। – danihp

+0

@danihp, क्षमा करें, मैं अभी भी __isnull = True को समझ नहीं पा रहा हूं। क्या यह इस स्थिति पर लागू होता है: "श्रेणी" वाला एक फॉर्म, उपयोगकर्ता फॉर्म भरता है और सबमिट करता है। अगर उपयोगकर्ता "श्रेणी" दर्ज नहीं करता है तो यह इस मान के लिए है। फिर यदि मैंने आपके पहले उदाहरण का पालन किया तो "श्रेणी" की बाधा के बिना डेटाबेस फ़िल्टर करें? अगर मेरी समझ सही है तो कृपया मुझे सही करें। अग्रिम में धन्यवाद। –

4

खैर, यह नहीं बल्कि पुराने सवाल है, लेकिन उन एक पंक्ति पर सशर्त छानने करना चाहते हैं, जो के लिए, यहाँ मेरी दृष्टिकोण (Btw, निम्नलिखित कोड शायद एक अधिक सामान्य तरीके से लिखा जा सकता है) है:

from django.db.models import Q 

def conditional_category_filter(category): 
    if category != None: 
     return Q(category=category) 
    else: 
     return Q() #Dummy filter 

user = User.objects.get(pk=1) 
category = Category.objects.get(pk=1) 
todays_items = Item.objects.filter(conditional_category_filter(category), user=user, date=now()) 

केवल एक चीज जो आपको देखने की ज़रूरत है conditional_category_filter(category)user=user जैसे कीवर्ड तर्कों से पहले कॉल करना है। उदाहरण के लिए निम्न कोड एक त्रुटि फेंक देगा:

todays_items = Item.objects.filter(user=user, date=now(), conditional_category_filter(category)) 
संबंधित मुद्दे