级联删除不适用于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