2011-12-17 12 views
34

यहाँ कुछ मॉडल:Django मॉडल ForeignKey on_delete विशेषता: पूर्ण अर्थ?

class UserProfile(models.Model): 
    name = models.CharField(max_length=30) 
    email = models.EmailField(unique=True, db_index=True) 
    birthday = models.DateField() 

class Photo(models.Model): 
    user = models.ForeignKey(UserProfile) 
    description = models.TextField(blank=True) 
    photo = models.ImageField(upload_to='img/photo') 

मान लें कि कोई उपयोगकर्ता 10 तस्वीरें (Photo मॉडल के 10 वस्तुओं) है करते हैं। जब उपयोगकर्ता खुद को हटा देता है तो उन सभी 10 Photo डेटाबेस पंक्तियों को स्वचालित रूप से हटा दिया जाएगा? (मैं डॉक्स पढ़ा है, लेकिन अंग्रेजी मेरी मूल भाषा है, इसलिए मैं on_delete विशेषता के बारे में सब कुछ समझ में नहीं आया नहीं है।)

उत्तर

15

, डिफ़ॉल्ट व्यवहार है कि हाँ। आप on_delete

के साथ इस व्यवहार को बदलने के लिए इस व्यवहार को बदल सकते हैं, व्यवस्थापक में उपयोगकर्ता प्रोफाइल को हटाने का प्रयास करें। यह पहले एक चेतावनी पृष्ठ दिखाता है, जो सभी संबंधित ऑब्जेक्ट्स को सूचीबद्ध करता है जो

+2

उन्होंने जुड़े 'खुद on_delete' ... मुझे लगता है कि आप अपने पूर्ण पोस्ट पढ़ने क्यों नहीं किया? –

+0

मैं इस व्यवहार को बदलना नहीं चाहता - मुझे इसकी ज़रूरत है! और यदि उपयोगकर्ता को व्यवस्थापक पैनेल से नहीं हटाते हैं, लेकिन कमांड लाइन-प्रभाव वही होगा? –

+1

प्रभाव वही है। नोट हालांकि, डिफ़ॉल्ट रूप से, Photo.photo में वास्तविक फ़ाइलें स्टोर * नहीं * हटाए जाएंगे – second

148

मैं इस मामले पर लागू होने पर on_delete के मानों के माध्यम से जाऊंगा। यह डॉक्स में नोटों के रूप में, इन कि models मॉड्यूल के सभी ताकि आप models.ForeignKey(UserProfile, on_delete=models.CASCADE) रूप में इसका इस्तेमाल होता है, आदि

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

  • CASCADE: जब आप UserProfile हटाते हैं, तो संबंधित Photo रों भी हटा दिया जाएगा। यह डिफ़ॉल्ट है। (तो आपके प्रश्न के पहलू के जवाब में, हाँ, यदि आप अपने उपयोगकर्ता खाते से हटा दें फ़ोटो स्वचालित रूप से हटा दिया जाएगा।)

  • PROTECT: इस संबंधित Photo रों के साथ एक UserProfile को हटाने से आप बंद हो जाएगा, एक django.db.models.ProtectedError को ऊपर उठाने अगर तुम कोशिश करो। विचार यह होगा कि उपयोगकर्ता को अपनी प्रोफ़ाइल को हटाने से पहले सभी Photo एस को अलग-अलग करने या हटाने की आवश्यकता होगी।

  • SET_NULL: जब आप UserProfile हटाने के लिए, सभी संबद्ध Photo रों अभी भी मौजूद होगा, लेकिन अब किसी भी UserProfile साथ संबद्ध किया जाएगा। ForeignKey परिभाषा में null=True की आवश्यकता होगी।

  • SET_DEFAULT: जब आप UserProfile हटाने के लिए, सभी संबद्ध Photo रों उनके डिफ़ॉल्ट UserProfile रूप ForeignKey परिभाषा default विशेषता द्वारा निर्दिष्ट (आप इस का प्रयोग कर एक के लिए रवाना पारित करने के लिए "अनाथ" तस्वीरों सकता है को इंगित करने के लिए बदल दिया जाएगा निश्चित उपयोगकर्ता - लेकिन यह आम है, SET_NULL या SET() अधिक आम हो जाएगा)

  • SET() जा रहा है: जब आप UserProfile, का लक्ष्य हटाना Photo s 'ForeignKey भेजे गए मान पर सेट हो जाएगामेंफ़ंक्शन, या यह कॉल करने योग्य होने पर क्या लौटाता है। (माफ करना, मुझे लगता है कि अच्छी तरह से समझा दिया है नहीं, लेकिन docs एक उदाहरण है जो बेहतर बताते है।)

  • DO_NOTHING: जब आप UserProfile हटाते हैं, तो संबंधित Photo रों, अनछुए बने रहेंगे, इस प्रकार एक टूटी हुई संदर्भ होने जब तक आपने इसका ख्याल रखने के लिए कुछ अन्य एसक्यूएल का इस्तेमाल किया है।

(इसके अलावा, on_delete एक विधि नहीं है। यह ForeignKey क्षेत्र की एक विशेषता है।)

+1

मैंने CASCADE को आजमाया लेकिन जब मैंने फ़ोटो हटा दी तो UserProfile हटा दिया गया और मैंने सुरक्षा को आजमाया जब मैंने फ़ोटो को हटाने की कोशिश की, तो यह एक त्रुटि उठाई। मैं सोच रहा था कि क्या यह संबंध के दूसरे छोर पर on_delete विशेषता का साइड इफेक्ट है। विशेष रूप से सुरक्षा के लिए, यदि आप सुरक्षित त्रुटि उठाई जाती है तो आप सभी फ़ोटो को कैसे हटा सकते हैं ताकि आप UserProfile को हटा सकें? – Crystal

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