2009-04-13 11 views
6

मैं कई प्रश्न पूछकर Django मॉडल वस्तुओं की एक सूची बनाते हैं। फिर मैं किसी भी डुप्लिकेट को हटाना चाहता हूं, (ये सभी ऑब्जेक्ट एक ही प्रकार के हैं जो auto_increment int PK के साथ हैं), लेकिन मैं सेट() का उपयोग नहीं कर सकता क्योंकि वे हैंशबल नहीं हैं।Django मॉडल - तथ्य के बाद पीके द्वारा डुप्लिकेट मानों को कैसे फ़िल्टर करें?

क्या ऐसा करने का एक तेज़ और आसान तरीका है? मैं आईडी के साथ कुंजी के रूप में एक सूची के बजाय एक dict का उपयोग करने पर विचार कर रहा हूँ।

उत्तर

6

क्या ऐसा करने का एक तेज़ और आसान तरीका है? मैं आईडी के साथ कुंजी के रूप में एक सूची के बजाय एक dict का उपयोग करने पर विचार कर रहा हूँ।

यह वही है जो मैं करता हूं यदि आप कई प्रश्न पूछने की अपनी वर्तमान संरचना में बंद हो गए थे। फिर एक बस dictionary.values() आपकी सूची वापस कर देगा।

यदि आपके पास थोड़ा अधिक लचीलापन है, तो Q ऑब्जेक्ट्स का उपयोग क्यों न करें? वास्तव में प्रश्न बनाने के बजाय, प्रत्येक क्वेरी को Q ऑब्जेक्ट में संग्रहीत करें और एक क्वेरी को निष्पादित करने के लिए थोड़ा सा या ("|") का उपयोग करें। यह आपके लक्ष्य को प्राप्त करेगा और डेटाबेस हिट को बचाएगा।

Django Q objects

+0

इस है कि कैसे आप आप वस्तुओं हड़पने होगा जब विदेशी कुंजी आईडी (तरह के कई भागों के साथ एक में क्वेरी की तरह) कई तालिकाओं से आ रहे हैं? – wsorenson

+0

वास्तव में यह सुनिश्चित नहीं है कि इसका मतलब क्या है। मुझे यकीन नहीं है कि आपको इसकी आवश्यकता कैसे है या विदेशी कुंजी आईडी क्या संदर्भ दे रहे हैं। –

+0

मैं कई तालिकाओं से वस्तुओं को पुनर्प्राप्त करने और रिश्तों को फैलाने के लिए क्यू ऑब्जेक्ट्स का उपयोग करने में सक्षम था। – wsorenson

0

यदि आदेश कोई फर्क नहीं पड़ता, तो एक नियम का प्रयोग करें।

3

यदि आप इतना है कि यह आईडी रिटर्न अपने मॉडल परिभाषा को __hash__ समारोह जोड़ने (यह मानते हुए अन्य हैश व्यवहार आप अपने एप्लिकेशन में हो सकता है के साथ हस्तक्षेप नहीं करता है) एक सेट का उपयोग कर सकते हैं:

class MyModel(models.Model): 

    def __hash__(self): 
     return self.pk 
0

"डुप्लिकेट" निकालें इस पर निर्भर करता है कि आप "डुप्लिकेट" को कैसे परिभाषित करते हैं।

यदि आप मिलान करने के लिए हर कॉलम (पीके को छोड़कर) चाहते हैं, तो यह गर्दन में दर्द है - यह बहुत तुलना कर रहा है।

यदि दूसरी तरफ, आपके पास कुछ "प्राकृतिक कुंजी" कॉलम (या कॉलम का छोटा सेट) है, तो आप आसानी से पूछ सकते हैं और इन्हें हटा सकते हैं।

master = MyModel.objects.get(id=theMasterKey) 
dups = MyModel.objects.filter(fld1=master.fld1, fld2=master.fld2) 
dups.all().delete() 

आप डुप्लिकेट पहचान के लिए कुंजी में से कुछ फ़ील्ड छोटे समूह निर्दिष्ट कर सकते हैं, यह बहुत अच्छी तरह से काम करता है।


संपादित

मॉडल वस्तुओं अभी तक डेटाबेस के लिए सहेजा नहीं गया है, तो आप इन चाबियों का एक टपल पर एक शब्दकोश कर सकते हैं।

unique = {} 
... 
key = (anObject.fld1,anObject.fld2) 
if key not in unique: 
    unique[key]= anObject 
12

सामान्य रूप से यदि संभव हो तो अपने सभी प्रश्नों को एक प्रश्न में जोड़ना बेहतर होता है। अर्थात।

q = Model.objects.filter(Q(field1=f1)|Q(field2=f2)) 

q1 = Models.object.filter(field1=f1) 
q2 = Models.object.filter(field2=f2) 

के बजाय पहली क्वेरी दोहराया मॉडल लौट रहा है तो का उपयोग अलग()

q = Model.objects.filter(Q(field1=f1)|Q(field2=f2)).distinct() 

अगर आपकी क्वेरी वास्तव में एक भी आदेश के साथ निष्पादित करने के लिए असंभव है, तो आपको अन्य उत्तरों में अनुशंसित एक dict या अन्य तकनीक का उपयोग करना होगा। यदि आप SO पर सटीक क्वेरी पोस्ट करते हैं तो यह सहायक हो सकता है और हम देख सकते हैं कि एक प्रश्न में गठबंधन करना संभव होगा या नहीं। मेरे अनुभव में, अधिकांश प्रश्न एक क्वेरीसेट के साथ किया जा सकता है।

+1

मैं क्यू ऑब्जेक्ट्स और विशिष्ट() - धन्यवाद का उपयोग करने में सक्षम था। – wsorenson

0

मैं इस एक का उपयोग करें:

dict(zip(map(lambda x: x.pk,items),items)).values() 
संबंधित मुद्दे