2009-10-08 12 views
15

के साथ काम कर रहा है मुझे कोई समस्या है क्योंकि मैं some_widget_instance.delete() का उपयोग करके विजेट हटा रहा हूं। मेरे पास एक ओवरराइड डिलीट() विधि के साथ विजेटफाइल नामक एक मॉडल भी है ताकि विजेटफाइल हटा दिए जाने पर मैं अपने हार्ड ड्राइव से फ़ाइलों को हटा सकूं। समस्या मैं आ रही है कि अगर मैं एक विजेट हटा सकते हैं और इसे इस तरह इसे से संबंधित WidgetFiles है:मैं मॉडल पर डिलीट() को ओवरराइड कैसे कर सकता हूं और यह अभी भी संबंधित डेलेट

class WidgetFile(models.Model): 

    widget = models.ForeignKey(Widget) 

खैर, जब मेरे द्वारा हटाए जाने कि विजेट, यह WidgetFiles नष्ट हो जाती हैं, लेकिन हटाने() विधि नहीं करता है ट्रिगर नहीं करते और मेरी अतिरिक्त हार्ड ड्राइव सामान नहीं करते हैं। किसी भी प्रकार की मदद की बेहद सराहना की जाती है।

+0

यह समस्या तब उत्पन्न हुई जब एक विजेट हटा दिया जाता है, यह इसके प्रत्येक आश्रितों (जिसे कक्षाओं के लिए विदेशी कुंजी संदर्भ है) पर हटाएं() विधि को ट्रिगर नहीं करता है। यह बस डीबी से संबंधित वस्तुओं को हटा देता है। इससे यह अधिक कुशल हो जाता है लेकिन स्पष्ट रूप से इस तरह की समस्याओं का कारण बनता है। – orokusaki

उत्तर

24

मैं यह पता लगा:

django-following-relationships-backward

उदाहरण देखें। मैं सिर्फ इतना है कि विजेट मॉडल पर इस डाल:

def delete(self): 
    files = WidgetFile.objects.filter(widget=self) 
    if files: 
     for file in files: 
      file.delete() 
    super(Widget, self).delete() 

यह संबंधित वस्तुओं में से प्रत्येक पर शुरू हो रहा आवश्यक हटाने() विधि है, इस प्रकार अपने कस्टम कोड को हटाने फ़ाइल ट्रिगर। यह अधिक डेटाबेस महंगा है, लेकिन जब भी आप हार्ड ड्राइव पर फ़ाइलों को हटाने की कोशिश कर रहे हैं, तो कुछ अतिरिक्त समय डीबी को हिट करने के लिए इतना बड़ा खर्च नहीं है।

+0

यह स्पष्ट नहीं है कि आपको क्यों लगता है कि सेलेरी या क्रॉन को ऐसी ही स्थिति का सामना नहीं करना पड़ेगा जहां फ़ाइल को हटाया जा रहा है, किसी अन्य प्रक्रिया से पढ़ने/लिखने के संचालन के लिए पहले ही खोला जा सकता है। किसी भी मामले में, आपको विशेष मामले को संभालने के लिए कोड करना होगा। –

+2

मैंने उस बिट को हटा दिया ... 4.5 साल पहले मैंने सोचा कि यह एक अच्छा विचार हो सकता है, लेकिन मुझे पूरा यकीन नहीं है कि क्यों। – orokusaki

1

some_widget_instance और Widget या WidgetFile का उदाहरण है? क्योंकि अगर यह Widget का उदाहरण है तो यह आपके कस्टम delete() फ़ंक्शन नहीं मिलेगा, जो WidgetFile कक्षा में है।

1

ऐसा लगता है कि एक विजेट एक विजेटफाइल से बिल्कुल जुड़ा हुआ है, तो यह केवल समझ में आता है। pre-deletesignal: उस मामले में आप एक On-to-one examples: से OneToOneField

# Delete the restaurant; the waiter should also be removed 
>>> r = Restaurant.objects.get(pk=1) 
>>> r.delete() 
+0

वास्तव में सच है, लेकिन Django सभी वेटर्स पर डेटाबेस स्तर के बड़े पैमाने पर हटा देता है, जो उनके प्रत्येक डिलीवरी विधियों को ट्रिगर किए बिना कम महंगा है, लेकिन कम पारंपरिक भी है। – orokusaki

1

बस इस समस्या को हल एक संभव तरीके से फेंकने के लिए उपयोग करना चाहिए। (किसी भी तरह से इसका अर्थ यह नहीं है कि कोई वास्तविक समाधान नहीं है।)

2

हटाने से पहले clear() का उपयोग करके, संबंधित ऑब्जेक्ट सेट से सभी ऑब्जेक्ट्स को हटा दें।

group.link_set.clear() 
group.delete() 
50

मैं एक ही बात कर रहा हूँ पारित करने के लिए भूल गया और Django में एक डला देखा दस्तावेज़ जो आपको सोचना चाहिए।

Overriding predefined model methods

ध्यान दें कि हटाना() एक वस्तु के लिए विधि जरूरी जब थोक में वस्तुओं को हटाने के लिए एक क्वेरीसमूह का उपयोग कर नहीं बुलाया जाता है हटाएँ ओवरराइड करना। यह सुनिश्चित करने के लिए कि अनुकूलित डिलीट तर्क निष्पादित हो जाता है, आप pre_delete और/या post_delete संकेतों का उपयोग कर सकते हैं।

इसका मतलब है कि आपका स्निपेट हमेशा नहीं करेगा जो आप चाहते हैं। Signals का उपयोग हटाने से निपटने के लिए एक बेहतर विकल्प है। , Django 1.9 से

import shutil 
from django.db.models.signals import pre_delete 
from django.dispatch import receiver 

@receiver(pre_delete) 
def delete_repo(sender, instance, **kwargs): 
    if sender == Set: 
     shutil.rmtree(instance.repo) 
0

अगर तुम सिर्फ क्षेत्र के लिए on_delete=models.CASCADE परिभाषित करेगा, इसे हटा दें पर सभी संबंधित वस्तुओं को हटाने जाएगा:

मैं निम्नलिखित के साथ चला गया।

+0

यह सही नहीं है। प्रश्न कैस्केडिंग deletes के बारे में नहीं है। यह संबंधित 'हटाएं' विधियों को सुनिश्चित करने के बारे में है। – orokusaki

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

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