2010-08-03 11 views
17

असल में मैं निम्न करने के लिए एक सुंदर तरीका जरूरत है एक क्वेरीसमूह के लिए वस्तुओं को जोड़ने: -मैन्युअल रूप से एक Django क्वेरीसमूह बना सकते हैं या नहीं बल्कि मैन्युअल

obj1 = Model1.objects.select_related('model2').get(attribute1=value1) 
obj2 = Model1.objects.select_related('model2').get(attribute2=value2) 
model2_qs = QuerySet(model=Model2, qs_items=[obj1.model2,obj2.model2]) 

मैं सही सोच नहीं किया जा सकता है, लेकिन कर कुछ की तरह निम्नलिखित असीम लगता है मेरे पास .: बेवकूफ -

obj1 = Model1.objects.select_related('model2').get(attribute1=value1) 
model2_qs = Model2.objects.filter(pk=obj1.model2.pk) 

हाँ, मैं (विशेष रूप से एक Django फार्म के लिए पारित करने के लिए) बाद में उपयोग के MODEL2 के क्वेरीसमूह के साथ खत्म करने की जरूरत है।

उपरोक्त पहले कोड ब्लॉक में, भले ही मैं get के बजाय filter का उपयोग करता हूं, तो मुझे स्पष्ट रूप से मॉडल 1 का प्रश्नोत्तरी होगा। मेरे मामले में रिवर्स लुकअप हमेशा संभव नहीं हो सकता है।

+0

क्षमा करें, यह स्पष्ट नहीं है कि आप वास्तव में क्या करने की कोशिश कर रहे हैं। कृपया दिखाएं कि आप क्या शुरू करना चाहते हैं और समाप्त करना चाहते हैं। –

+0

मैं जो कहने की कोशिश कर रहा हूं वह है, अगर मैं obj1.model2 का उपयोग कर मॉडल 2 ऑब्जेक्ट्स का पहले से ही संदर्भ ले सकता हूं, तो इन ऑब्जेक्ट्स को मॉडल 2 ऑब्जेक्ट्स के क्वेरीरीसेट में जोड़ने का एक तरीका होना अच्छा होगा। – chefsmart

+0

मैं जो भी कर रहा हूं उसका अनुसरण नहीं कर सकता। यदि आप अपने मॉडल के लिए प्रासंगिक कोड पोस्ट कर सकते हैं और आप जो भी कर सकते हैं उसके बारे में सामान्य विवरण का एक वाक्य या दो जोड़ सकते हैं तो हम मदद कर सकते हैं। –

उत्तर

33

यदि आप बस कुछ जटिल प्रक्रियाओं के माध्यम से चुने गए आइटमों की क्वेरीसेट बनाने की तलाश में हैं, तो एसक्यूएल में प्रतिनिधित्व योग्य नहीं है, तो आप हमेशा __in ऑपरेटर का उपयोग कर सकते हैं।

wanted_items = set() 
for item in model1.objects.all(): 
    if check_want_item(item): 
     wanted_items.add(item.pk) 

return model1.objects.filter(pk__in = wanted_items) 

आपको स्पष्ट रूप से इसे अपनी स्थिति में अनुकूलित करना होगा, लेकिन इसे कम से कम आपको एक प्रारंभिक बिंदु देना चाहिए।

4

आप क्वेरीज़ को मैन्युअल रूप से ऑब्जेक्ट्स नहीं जोड़ सकते हैं। लेकिन आप उन्हें एक सूची में क्यों नहीं डालते?

obj1 = Model1.objects.select_related('model2').get(attribute1=value1) 
obj2 = Model1.objects.select_related('model2').get(attribute2=value2) 
model2 = list(obj1, obj2) 
+1

यह एक साफ समाधान है। मुझे लगता है कि '_result_cache' का उपयोग करके आर्थर सुझाव दिया गया एक अच्छा विचार है। –

15

मैन्युअल रूप से एक क्वेरीसमूह के लिए वस्तुओं जोड़ने के लिए, _result_cache कोशिश:

objs = ObjModel.objects.filter(...) 
len(objs) #or anything that will evaluate and hit the db 
objs._result_cache.append(yourObj) 

पुनश्च: मैं समझता हूँ कि नहीं था (या करने की कोशिश की) chefsmart के सवाल, लेकिन मैं शीर्षक में सवाल को यह जवाब विश्वास करते हैं।

+5

यह एपीआई के आंतरिक कार्यान्वयन का उपयोग करता है, जो किसी भी अपग्रेड में बदल सकता है। – anizzomc

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