级联删除不适用于django模型

级联删除不适用于django模型,django,django-models,Django,Django Models,我一直在使用与用户相关的级联视频模型 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, defau

我一直在使用与用户相关的级联视频模型

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)
当我触发对用户的删除时

def clear_user(request):
    user = request.user
    user.delete()
这不会触发重载的delete函数。如何实现在用户删除时调用重载的delete函数?

由于数据库中的相关对象是用sql直接删除的,它不调用相关模型的delete方法,所以覆盖delete方法不起作用。这可能是使用pre_delete或post_delete信号的一种方法。
因此,根据我在这个特定示例中的理解,我需要删除用户对象中的视频对象。在回调中使用视频作为发送方也可以,这取决于您。有意义的是queryset.delete方法不调用模型的delete方法。您也可以提供sender Video方法吗?将sender关键字参数修改为Video,就可以了。
# 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