特定发送者的停止信号发送触发器

时间:2019-07-05 13:21:16

标签: django django-models django-signals

我正在使用 Django 2.2

在我的应用程序中,有一个共享用户功能,并且每个共享用户都被添加到 User 模型中,并且is_shared字段设置为 True

共享用户链接到 SharedUser 模型之类的用户,例如

class SharedUser(models.Model)
    user = models.ForeignKey(User, on_delete=models.CASCASE, related_name='owner_user')
    shared_user = models.ForeignKey(User, on_delete=models.CASCASE, related_name='shared_user')

SharedUser 模型删除记录时,我还必须从 User 模型中删除链接的shared_user记录。为此,我使用的是post_signal接收器。

receivers.py

@receiver(post_delete, sender=SharedUser, dispatch_uid='post_delete_shared_user')
def post_delete_shared_user(sender, instance, *args, **kwargs):
    try:
        if instance and instance.shared_user:
            owner = instance.user
            instance.shared_user.delete()
    except:
        pass

,然后将接收器加载到 app.py 配置

class SharedUsersConfig(AppConfig):
    name = 'shared_users'

    def ready(self):
        from . import receivers

现在,每当删除 SharedUser 模型中的记录时,它都会进行大量SQL查询。

enter image description here

从{strong> apps.py 文件中删除import receivers时。

enter image description here

使用接收方删除关联用户时,还会进行更多的SQL查询。

在我的用例中,除{strong> SharedUser 模型之外,没有其他地方将shared_user与其他任何模型关联。

  1. 如何在删除用户时减少查询?
  2. 仅在这种情况下删除用户时,可以禁用发送信号吗?由于shared_user与任何其他模型都不相关。

1 个答案:

答案 0 :(得分:0)

问题出在您的shared_user = models.ForeignKey(User, on_delete=models.CASCASE, related_name='shared_user'),特别是on_delete属性中。

每次删除User记录时,所有相关的SharedUser记录也会被删除。

为防止删除,您应该使用on_delete=models.SET_NULL