views:

48

answers:

1

I have 2 models

class Vhost(models.Model):
    dns = models.ForeignKey(DNS)
    user = models.ForeignKey(User)
    extra = models.TextField()


class ApplicationInstalled(models.Model):
    user = models.ForeignKey(User)
    added = models.DateTimeField(auto_now_add=True)
    app = models.ForeignKey(Application)
    ver = models.ForeignKey(ApplicationVersion)
    vhost = models.ForeignKey(Vhost)
    path = models.CharField(max_length=100, default="/")


    def delete(self):

        #
        # remove the files
        #
        print "need to remove some files"


        super(ApplicationInstalled, self).delete()

If I do the following

>>> vhost = Vhost.objects.get(id=10)
>>> vhost.id
10L
>>> ApplicationInstalled.objects.filter(vhost=vhost)
[<ApplicationInstalled: http://wiki.jy.com/&gt;]
>>> vhost.delete()
>>> ApplicationInstalled.objects.filter(vhost=vhost)
[]

As you can see there is an applicationinstalled object linked to vhost but when I delete the vhost, the applicationinstalled object is gone but the print never gets called.

Any easy way to do this without iterating through the objects in the vhost delete?

Solution

def delete_apps(sender, **kwargs):
    obj = kwargs['instance']

    print "need to delete apps"


pre_delete.connect(delete_apps, sender=ApplicationInstalled)
+1  A: 

Ever since django got signals I've found that I almost never need to override save/delete.

Whatever you need to do can likely be accomplished in a pre_delete or post_delete signal.

In this case, it seems that you'd want is to delete in bulk in a pre_delte signal.

rz
Thanks.. seems to work nicely
Mike