2012-01-25 12 views
9

मैं एक django परियोजना लिख ​​रहा हूँ। और उपयोगकर्ता जानना चाहता है कि उपयोगकर्ता अपना खाता हटा देता है, क्या इस उपयोगकर्ता से संबंधित सभी ऑब्जेक्ट को हटाने के लिए django build-in एक तरीका है (उदा। कुछ सामान्य विदेशी_की)? या मुझे संबंधित प्रत्येक ऑब्जेक्ट को हटाने के लिए "post_delete" सिग्नल का उपयोग करना चाहिए?Django उपयोगकर्ता के प्रोफ़ाइल और पोस्ट को हटाने और उपयोगकर्ता के हटाए जाने के बाद सभी आवेषण को कैसे हटाया जाए?

+0

देखें क्या आप वाकई संबंधित वस्तुओं पहले से ही हटा नहीं किया जा रहा हैं? एक इंटिग्रिटी एरर से बचने के लिए गैर-शून्यणीय विदेशीकी को हटा दिया जाना चाहिए, और आईआईआरसी डीजेगो डिफ़ॉल्ट रूप से ऐसा करेगा। जेनेरिक विदेशी कुंजी द्वारा, क्या आपका मतलब है [जेनेरिक फॉर्निनेकी] (https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.generic.GenericForeignKey) विशेष रूप से? क्योंकि यह अधिक जटिल हो जाता है। – AdamKG

+0

@AdamKG मुझे लगता है कि मेरा मतलब जेनेरिक फॉर्निनेकी विशेष रूप से यहां नहीं था। मेरा मतलब है कि ऑन डिलीट कैस्केड जिसे मुझे पहले से ही एक जवाब मिला है। मुझे स्पष्ट रूप से समझ में नहीं आया है कि जेनेरिकॉर्निनेकी जब तक सामग्री प्रकार, मैं पढ़ रहा हूं। एक अन्य सवाल जो शायद इस के सापेक्ष नहीं है, लेकिन मैं पूछना चाहता हूं, मुझे कुछ उपयोगकर्ता प्रोफ़ाइल कार्यान्वयन मिला, वे सभी OneToOne के बजाय ForeignKey का उपयोग करते हैं। क्या वे यहां एक से अधिक संबंध मानते हैं या इससे कोई फर्क नहीं पड़ता। – Xinghan

उत्तर

13

जब Django किसी ऑब्जेक्ट को हटा देता है, डिफ़ॉल्ट रूप से यह SQL बाधा को हटाकर SQL बाधा के व्यवहार को अनुकरण करता है - दूसरे शब्दों में, किसी भी ऑब्जेक्ट जिसमें ऑब्जेक्ट पर इंगित करने वाली विदेशी कुंजी को हटा दिया जाएगा, उसके साथ हटा दिया जाएगा।

https://docs.djangoproject.com/en/dev/topics/db/queries/#deleting-objects

b = Blog.objects.get(pk=1) 
# This will delete the Blog and all of its Entry objects. 
b.delete() 
+0

बहुत बहुत धन्यवाद! – Xinghan

5

इससे पहले कि आप मूल वस्तु को नष्ट आप स्पष्ट रूप से मूल वस्तु को सामान्य विदेशी कुंजी संदर्भ को हटाना चाहिए। उदाहरण के लिए

Image.objects.filter(object_id=object_to_be_deleted.id,content_type = ContentType.objects.get_for_model(bject_to_be_deleted.get_profile())).delete() 
object_to_be_deleted.delete() 

व्यापक हटाना जब यह उदाहरण के लिए, काम करता है, मॉडल में एक-से-एक रिश्ते के लिए है, लेकिन यह सामान्य विदेशी कुंजी संबंधों के लिए काम करने के लिए प्रतीत नहीं होता है महान है।

+0

बहुत बहुत धन्यवाद! – Xinghan

+0

हालांकि मैं आपकी सिफारिश से सहमत हूं, बयान "जेनेरिक विदेशी कुंजी संबंधों के लिए काम नहीं करता है" को और स्पष्टीकरण की आवश्यकता है क्योंकि यह सामान्य मामला नहीं है। – Wtower

+0

@Wtower यह 2012 में सच था (Django 1.4?) लेकिन यह प्रलेखन (https://docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/#reverse-generic-relations) से आता है जो अब " यदि आप एक ऑब्जेक्ट को हटाते हैं जिसमें जेनेरिकरेलेशन होता है, तो कोई भी ऑब्जेक्ट जिसमें जेनेरिक फॉर्निनेकी है उस पर इशारा करते हुए भी हटा दिया जाएगा "जो एक Django 1.7 परिवर्तन हो सकता है। –

7

Django उपयोगकर्ताओं को हटाने की सिफारिश नहीं करता क्योंकि विदेशी कुंजी टूट जाएंगी। यह इस कारण से है कि उन्होंने is_active विधि शामिल की है।

https://docs.djangoproject.com/en/1.3/topics/auth/#django.contrib.auth.models.User.is_active

+0

बहुत बहुत धन्यवाद! – Xinghan

+0

यह एक पुरानी और संभवतः पुरानी सिफारिश है और लिंक टूटा हुआ है। – Wtower