2015-03-06 6 views
12

के लिए पद्धति को हटाना मैं Django के मॉडल छवि क्षेत्रों के लिए डिस्क में अनाथ फ़ाइलों को हटाने के क्रम में विधि को नष्ट अधिभावी कर रहा हूँ, व्यवस्थापक से ऑब्जेक्ट्स, लेकिन जब मैं एकाधिक ऑब्जेक्ट्स चुनता हूं और उन्हें हटा देता हूं, तो ऐसा नहीं लगता है। मैं थोड़ी देर के लिए गुगल रहा हूं लेकिन इसके लिए उत्तर पाने के लिए सही कीवर्ड नहीं मारा है, न ही आधिकारिक दस्तावेज इस विषय के बारे में बात करते हैं।अवहेलना Django के मॉडल कुछ इस तरह बड़ी संख्या में मिटाने

उत्तर

19

It does:

हटाने() विधि एक थोक हटाना करता है और अपने मॉडल पर किसी भी हटाने() पद्धतियों फोन नहीं करता है। हालांकि, यह सभी हटाए गए ऑब्जेक्ट्स (कैस्केड डिलीशन सहित) के लिए pre_delete और post_delete संकेतों को छोड़ देता है।

कि के लिए काम करने के लिए, आप QuerySet पर हटाने की विधि ओवरराइड कर सकते हैं, और फिर लागू कि QuerySet प्रबंधक के रूप में:

class ImageQuerySet(models.QuerySet): 

    def delete(self, *args, **kwargs): 
     for obj in self: 
      obj.img.delete() 
     super(ImageQuerySet, self).delete(*args, **kwargs) 

class Image(models.Model): 
    objects = ImageQuerySet.as_manager() 
    img = models.ImageField(upload_to=get_image_path) 
    ... 
    def delete(self, *args, **kwargs): 
     self.img.delete() 
     super(Image, self).delete(*args, **kwargs) 
+0

मुझे लगता है कि मैंने इसे प्रलेखन में पढ़ा लेकिन पता नहीं था कि यह व्यवस्थापक के थोक हटाए गए पर लागू होता है। वैसे भी, मुझे आपका समाधान पसंद आया, बहुत बहुत धन्यवाद! –

6

सीधे डेटाबेस पर क्वेरीसेट कार्यों की विधि हटाएं। यह Model.delete() विधियों को कॉल नहीं करता है। docs से:

ध्यान रखें कि इस वसीयत, जब भी संभव हो, विशुद्ध रूप से एसक्यूएल में क्रियान्वित किया जा, और इसलिए हटाना() अलग-अलग वस्तु उदाहरणों के तरीकों जरूरी प्रक्रिया के दौरान कहा जा नहीं होंगे। यदि आपने मॉडल क्लास पर एक कस्टम डिलीट() विधि प्रदान की है और यह सुनिश्चित करना चाहते हैं कि इसे कहा जाता है, तो आपको उस मॉडल के उदाहरणों को मैन्युअल रूप से "मैन्युअल" हटाने की आवश्यकता होगी (उदाहरण के लिए, एक क्वेरीसेट पर पुनरावृत्ति करके और हटाएं() को कॉल करना प्रत्येक ऑब्जेक्ट व्यक्तिगत रूप से) QuerySet की थोक हटाएं() विधि का उपयोग करने के बजाय।

आप Django प्रशासन इंटरफ़ेस के डिफ़ॉल्ट व्यवहार को ओवरराइड करना चाहते हैं, आप एक कस्टम delete कार्रवाई लिख सकते हैं:

https://docs.djangoproject.com/en/1.7/ref/contrib/admin/actions/

एक अन्य विधि delete विधि के बजाय post_delete (या pre_delete) ओवरराइड करने के लिए संकेत है:

https://docs.djangoproject.com/en/1.7/ref/signals/#django.db.models.signals.post_delete

pre_delete की तरह, लेकिन मॉडल के डिलीट() विधि और एक क्वेरीसेट की हटाएं() विधि के अंत में भेजा गया।

+1

समाधान के लिए धन्यवाद। मैं उन्हें एक कोशिश दूंगा लेकिन मैं ग्वाइनब्लिड के जवाब को स्वीकार्य कारण के रूप में चिह्नित कर रहा हूं क्योंकि मैं उसका अपमान (क्लीनर लगता है) का समर्थन करता हूं। –

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