Mike
Mike

Reputation: 7841

django deleting models and overriding delete method

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/>]
>>> 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)

Upvotes: 3

Views: 3656

Answers (1)

rz.
rz.

Reputation: 20067

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.

Upvotes: 5

Related Questions