2012-07-30 12 views
6

मैं बाहर स्पष्ट और मेरे Django मॉडल में एक टेबल को फिर से लोड करने के लिए कोशिश कर रहा हूँ करता है, औरDjango मॉडल:। Objects.all() को हटा() नहीं

>>> models.PuzzleSum.objects.all().count() 
2644 
>>> models.PuzzleSum.objects.all().delete() 
>>> models.PuzzleSum.objects.all().count() 
2535 

... WTF? हमेशा जादू संख्या 109. मुझे पता है कि मैं सिर्फ डेटाबेस में जा सकता हूं और उन्हें हाथ से हटा सकता हूं (या लूप जब तक वे सब खत्म नहीं हो जाते) लेकिन मैं उत्सुक हूं।

+0

डुनो, शायद पहेलीसम का बेस क्वेरीसेट कस्टम प्रबंधक पर सेट हो गया है? जैसे https://docs.djangoproject.com/en/dev/topics/db/managers/#modifying-initial-manager-querysets –

+0

अच्छा विचार, लेकिन नहीं। यह एक डेटा लोड स्क्रिप्ट है जो एक django खोल से चलती है, और (प्रयास) हटाएं मॉडल को आयात करने के बाद पहली चीज है। – AlanL

+0

क्या आप पहेलीसम और किसी भी संबंधित मॉडल के लिए कोड जोड़ सकते हैं? –

उत्तर

2

हां, Django एक वस्तु में सभी वस्तुओं को संग्रहित कर रहा है, और फिर उन्हें एक-एक करके हटा देता है। यही कारण है कि केवल अनूठे आइटम हटा दिए जाते हैं, क्योंकि यह उनके ऊपर पुनरावृत्त होता है।

self.data = SortedDict([(model, self.data[model]) 
         for model in sorted_models]) 

और उसके बाद:: यह Django Collector वर्ग, जिसे हटाने के लिए मॉडल एकत्र करता है से है जब तक आप अपने मॉडल की __hash__ अधिरोहित किया है के रूप में

# delete instances 
for model, instances in self.data.iteritems(): 
    query = sql.DeleteQuery(model) 
    pk_list = [obj.pk for obj in instances] 
    query.delete_batch(pk_list, self.using) 

, जब मॉडल जमा हो जाती है self.data dict में, केवल अद्वितीय वाले संग्रहित होते हैं, और फिर हटा दिए जाते हैं।

0

(पर मैक ओएस एक्स शेर btw Django 1.3.1) प्रश्न का उत्तर में ऊपर मेरी टिप्पणी परिवर्तित:

मैं क्योंकि एक के हैश और PuzzleSum में eq अधिरोहित है "डुप्लिकेट" की विशेष परिभाषा जिसे मैं उपयोग करना चाहता हूं। और अनुमान लगाएं: मेरे पास 109 विशिष्ट हैश मान हैं। Django अपने हटाने के तर्क में आंतरिक रूप से कहीं भी वस्तुओं का एक सेट का उपयोग करना चाहिए।

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