级联删除不适用于Django模型

时间:2020-06-13 09:53:28

标签: 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, 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()

这不会触发过载的删除功能。如何实现要在用户删除时调用的重载删除功能?

1 个答案:

答案 0 :(得分:1)

因为相关对象是直接用sql在数据库中删除的,所以它不会调用相关模型的delete方法,因此它无法覆盖delete方法。这可能是使用pre_delete或post_delete信号的一种方法。

# 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
相关问题