Триггер отправки стоп-сигнала для конкретного отправителя - PullRequest
0 голосов
/ 05 июля 2019

Я использую Django 2.2

В моем приложении есть функция общего пользователя, и каждый общий пользователь добавляется в Пользователь модель с 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 модель, мне также нужно удалить связанную запись shared_user из 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 config

class SharedUsersConfig(AppConfig):
    name = 'shared_users'

    def ready(self):
        from . import receivers

Теперь при удалении записи из модели SharedUser выполняется множество запросов SQL.

enter image description here

Когда import receivers удаляется из файла apps.py .

enter image description here

Когда получатель используется для удаления связанного пользователя, выполняется намного больше запросов SQL.

В моем случае использование shared_user нигде не связано ни с какой другой моделью, кроме SharedUser. модель.

  1. Как уменьшить запрос на удаление пользователя?
  2. Можно ли отключить отправку сигнала, когда пользовательудалено только для этого сценария?Поскольку shared_user не имеет отношения к какой-либо другой модели.

1 Ответ

0 голосов
/ 05 июля 2019

Проблема в вашем shared_user = models.ForeignKey(User, on_delete=models.CASCASE, related_name='shared_user'), в частности атрибуте on_delete.

Каждый раз, когда вы удаляете запись User, все связанные с ней записи SharedUser также удаляются.

Чтобы предотвратить удаление, вы должны использовать on_delete=models.SET_NULL.

...