2012-10-05 17 views
28

मैं निम्नलिखित मॉडल है:OneToOneField और हटाया जा रहा है

from django.db import models 
from django.contrib.auth.models import User 


class Profile(models.Model): 
    user = models.OneToOneField(User) 
    # ... 

    def __unicode__(self): 
     return u'%s %s' % (self.user.first_name, self.user.last_name) 

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

उत्तर

41

Profile के बाद से लिंक, यह रिश्ते में निर्भर मॉडल है। इसलिए जब आप किसी उपयोगकर्ता को हटाते हैं, तो यह सभी निर्भर मॉडल हटा देता है। हालांकि जब आप प्रोफ़ाइल हटाते हैं, क्योंकि User प्रोफ़ाइल पर निर्भर नहीं है, तो इसे हटाया नहीं जाता है।

दुर्भाग्य से, on_delete Django docs के अनुसार, कोई on_delete नियम है जो मूल संबंधों को हटा देता है।

class Profile(models.Model): 
    # ... 

    def delete(self, *args, **kwargs): 
     self.user.delete() 
     return super(self.__class__, self).delete(*args, **kwargs) 

फिर जब कर रही: ऐसा करने में, आप Profile के delete विधि अधिलेखित कर सकते हैं

Profile.objects.get(...).delete() 

भी प्रोफाइल के उपयोगकर्ता को हटा देगा। के रूप में Django द्वारा सिफारिश की

Profile.objects.filter(...).delete() 

उस मामले में,: हालांकि delete विधि जब तब से (है जो क्या Django व्यवस्थापक में कहा जाता है) का उपयोग कर क्वेरीसमूहों प्रोफाइल को हटाने नहीं कहा जा जाएगा Django एसक्यूएल थोक में वस्तुओं को हटाने के लिए DELETE का उपयोग करता है docs, आपको post_delete सिग्नल (docs) का उपयोग करना होगा।

from django.dispatch import receiver 
from django.db.models.signals import post_delete 

@receiver(post_delete, sender=Profile) 
def post_delete_user(sender, instance, *args, **kwargs): 
    if instance.user: # just in case user is not specified 
     instance.user.delete() 
+0

बहुत बहुत धन्यवाद! मैं अभी भी Django में नया हूं, इसलिए यदि किसी अन्य Django Noobs को यह पता चलता है, तो मुझे काम करने के लिए @receiver सजावट में एक प्रेषण_यूड जोड़ना पड़ा। लेकिन उसके बाद, यह बहुत अच्छा काम किया! – Nick

7

उपयोग Profile के हटाने विधि पर एक संकेत जा सकते हैं और संबंधित उपयोगकर्ता को हटाने के लिए: User को

from django.db.models.signals import post_delete 

def delete_related_user(sender, **kwargs): 
    deleted_profile = kwargs['instance'] 
    deleted_profile.user.delete() 

post_delete.connect(delete_related_user, sender=Profile) 
+0

आपके उत्तर के लिए धन्यवाद! मैं miki725 के जवाब के साथ जा रहा था क्योंकि यह थोड़ा और पूरा और थोड़ा अधिक कॉम्पैक्ट था। मैं वास्तव में आपके समय की सराहना करता हूं, यद्यपि! – Nick

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