2011-05-06 19 views
5

आप Django व्यवस्थापक रिकॉर्ड हटाने की कार्रवाई/पृष्ठ को कैसे गति देंगे?Django व्यवस्थापक को हटाएं पृष्ठ

मेरे पास मॉडल ए के लिए एक विदेशी कुंजी बाधा के साथ एक मॉडल बी है। ए में प्रत्येक रिकॉर्ड के लिए, बी से बाध्य ए में लगभग 10k रिकॉर्ड हैं इसलिए जब मुझे डिफ़ॉल्ट में हटाए गए ए में एक रिकॉर्ड हटाना होगा "हटाएं चयनित ए "एडमिन में एक्शन, डीजेंगो को पूछताछ करने में 15 मिनट लगेंगे और बी में हटाए गए प्रत्येक रिकॉर्ड को प्रदर्शित करेंगे। मैं इसे कैसे संशोधित करूंगा ताकि हजारों आश्रित वस्तुओं को सूचीबद्ध करने की बजाय, यह केवल निर्भर वस्तुओं की गिनती को प्रदर्शित करता है?

उत्तर

8

सामान्य रूप से अपने उत्तर खोजने के लिए django स्रोत ब्राउज़ करें (यह आश्चर्यजनक रूप से परिवर्तनीय, फ़ंक्शंस, कक्षाएं और तार्किक रूप से नामित फ़ाइलों के साथ पठनीय है)।

django/contrib/admin/templates/admin/delete_confirmation.html को देखते हुए (Django 1.2.5 में), तो आपको 24 वीं लाइन है कि एक टेम्पलेट देखेंगे शामिल हैं:

<ul>{{ deleted_objects|unordered_list }}</ul> 

आप

<p>{{ deleted_objects|count }} objects</p> 

या

कहने के लिए इस बदलते हैं तो
{% if 100 < deleted_objects|count %} 
    <p>{{ deleted_objects|count }} objects</p> 
{% else %} 
    <ul>{{ deleted_objects|unordered_list }}</ul> 
{% endif %} 

यह केवल हटाए गए ऑब्जेक्ट्स की गणना प्रदर्शित करेगा (यदि कई हटाए गए ऑब्जेक्ट्स हैं) ।

आप बड़े पैमाने पर हटाने को अधिक तेज़ी से करने के लिए SQL लेनदेन का उपयोग करने के लिए django/contrib/admin/templates/admin/actions.py संपादन के साथ प्रयोग करना भी चाह सकते हैं। देखें: http://docs.djangoproject.com/en/dev/topics/db/transactions/

मूल रूप से action.py उचित क्वेरीसेट बनाकर काम करता है, सीधे क्वेरीसेट को हटाकर कॉल करता है, लेकिन इसे एक डीबी लेनदेन में समूहित नहीं करता है। नमूना स्क्लाइट डेटाबेस पर सरल समय परीक्षण करने से मैंने पाया कि लेनदेन के बिना ~ 150 ऑब्जेक्ट्स को हटाने से qs.delete() और for obj in qs: obj.delete() का उपयोग करके 13.4 सेकेंड का उपयोग करके 11.3 सेकेंड लग गए। लेनदेन का उपयोग करना (@transaction.commit_on_success हटाने वाले कार्यों से पहले), वही आदेश केवल 0.35 सेकंड और 0.3 9 सेकेंड (लगभग 30 गुना तेज) लेते थे। लेनदेन का उपयोग करके अनुमोदित डेटाबेस अस्थायी रूप से लॉक कर सकता है, जो एक स्वीकार्य विकल्प नहीं हो सकता है।

django व्यवस्थापक को समझदारी से विस्तारित करने के लिए (आमतौर पर आप सीधे स्रोत को संपादित नहीं करना चाहते हैं, खासकर यदि अन्य उपयोगकर्ता एक ही फाइल का उपयोग कर रहे हैं या यदि आप कभी भी बाद में वापस लौटना चाहते हैं या अन्य django साइट्स चला रहे हैं एक ही मशीन) देखें: http://www.djangobook.com/en/1.0/chapter17/#cn35

+0

{% for deletable_object in deletable_objects %} <ul>{{ deletable_object|unordered_list }}</ul> {% endfor %} 

के लिए यह मदद के होंगे, लेकिन अन्य बड़ी hangup django.contrib.admin.actions.py जहां get_deleted_objects करने के लिए कॉल किया जाता है में है (लाइन 34 में django 1.4)। यहां ऑब्जेक्ट का पूर्ण पदानुक्रम टेम्पलेट में बाद के डिस्प्ले के लिए संकलित किया गया है। यह वह जगह है जहां मेरा कोड कम से कम लटक रहा था। उम्मीद है कि यह भी मदद करता है। – Rob

0

Django 1.4 के लिए @ drjimbob का नुस्खा थोड़ा अलग है:

अद्यतन फ़ाइल:

django/contrib/admin/templates/admin/delete_selected_confirmation.html 

और लाइन 35 पर जगह ले

{% for deletable_object in deletable_objects %} 
    {% if 100 < deletable_object|length %} 
     <p>{{ deletable_object|length }} objects</p> 
    {% else %} 
     <ul>{{ deletable_object|unordered_list }}</ul> 
    {% endif %} 
{% endfor %} 
संबंधित मुद्दे