london_utku
london_utku

Reputation: 1312

Cascade delete not working with django models

I have been using a Video model related with the user on a cascade basis.

from django.conf import settings

class Video(models.Model):
    uuid = models.CharField(max_length=255, default="")
    title = models.CharField(max_length=255, default="")
    description = models.CharField(max_length=5000, default="")
    privacy = models.CharField(max_length=10, default="public")
    category = models.CharField(max_length=50, default="General")

    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=None)

    def delete(self, *args, **kwargs):
        publisher = pubsub_v1.PublisherClient()
        topic_name = '...'
        message_to_publish = self.path
        publisher.publish(topic_name, data=message_to_publish.encode('utf-8'), spam='eggs')
        logging.info("Sending pubsub to delete folder : {0}".format(message_to_publish))
        super(Video, self).delete(*args, **kwargs)

When I trigger a delete on the user,

def clear_user(request):
    user = request.user
    user.delete()

This does not trigger the overloaded delete function. How can I achieve that overloaded delete function to be called on user delete?

Upvotes: 3

Views: 979

Answers (1)

Blackdoor
Blackdoor

Reputation: 982

because the related objects are deleted with sql in database directly, it do not call the delete method of the related model, so it does not work to override delete method. it could be one way to use pre_delete or post_delete signal.

# signals.py
from django.db.models.signals import pre_delete
from django.dispatch import receiver
from django.contrib.auth import get_user_model

User=get_user_model()

@receiver(pre_delete, sender=User)
def user_delete_callback(sender, **kwarg):
    # do something
    print('user delete callback:', kwarg)

# apps.py
from django.apps import AppConfig
class MyAppConfig(AppConfig):
    name = 'myapp'
    def ready(self):
        from . import signals

Upvotes: 3

Related Questions