#27406: Signals pre_delete and post_delete break logical relationship of models and behave in diffrently with different backends -------------------------------------+------------------------------------- Reporter: Seti | Owner: nobody Type: Uncategorized | Status: new Component: Database layer | Version: 1.10 (models, ORM) | Severity: Normal | Resolution: Keywords: Databases | Triage Stage: | Unreviewed Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+-------------------------------------
Comment (by Seti): Replying to [comment:3 Tim Graham]: > Resolved. If a field has attributes null=True and blank=True, and using signals pre_delete (as example) attribute "on_delete" does not working at all. I tried on_delete=models.CASCADE and models.SET_NULL, it is does not working. I made dived deep in SQL generate from the Django ORM. On my code (with activate signal "pre_delete") {{{ User.objects.filter().delete() }}} it generated a next code (a main part): {{{ DELETE FROM "users_user" WHERE "users_user"."id" IN ('87420c3a- dae9-4c87-9095-064d8806530b'::uuid) DELETE FROM "users_profile" WHERE "users_profile"."id" IN ('f4d4aa39-e645-4da0-aef3-c2853c5d5e91'::uuid) DELETE FROM "diaries_diary" WHERE "diaries_diary"."id" IN ('b12f5507-3957-4384-ab32-9ffbf30acd87'::uuid) INSERT INTO "notifications_notification" ("id", "level", "action", "is_read", "is_deleted", "is_public", "is_emailed", "created", "is_anonimuos", "user_id", "user_display_text", "target_content_type_id", "target_object_id", "target_display_text", "action_target_content_type_id", "action_target_object_id") VALUES ('1d2b02d2-aec0-45fd-a23f-ef01262f4960'::uuid, 'success', 'deleted_user', false, false, true, true, '2016-11-08T09:38:08.317519+00:00'::timestamptz, false, '87420c3a-dae9-4c87-9095-064d8806530b'::uuid, 'uкузнецов (savanna...@lee.com)', NULL, NULL, NULL, NULL, NULL) UPDATE "notifications_notification" SET "level" = 'success', "action" = 'deleted_user', "is_read" = false, "is_deleted" = false, "is_public" = true, "is_emailed" = true, "created" = NULL, "is_anonimuos" = false, "user_id" = '87420c3a-dae9-4c87-9095-064d8806530b'::uuid, "user_display_text" = 'uкузнецов (savanna...@lee.com)'', "target_content_type_id" = NULL, "target_object_id" = NULL, "target_display_text" = NULL, "action_target_content_type_id" = NULL, "action_target_object_id" = NULL WHERE "notifications_notification"."id" = '1d2b02d2-aec0-45fd-a23f-ef01262f4960'::uuid }}} An error is here {{{ "user_id" = '87420c3a-dae9-4c87-9095-064d8806530b'::uuid, "user_display_text" = 'uкузнецов (savanna...@lee.com)'' }}} **"user_id" must be NULL**, because a user must be deleted On a python side it is resolved very simple {{{ class Notification(models.Model): .......................... def save(self, *args, **kwargs): .................................. user = kwargs.pop('user', None) if user is not None: # user will be deleted, so we keep it full name for display self.user_display_text = user.get_full_name() # manualy set field "user" to None (NULL in SQL), because the Django does not made it self.user = None self.full_clean() super(Notification, self).save(*args, **kwargs) }}} So, dear the Django developer team, please point this caution about using signals "pre_delete" and "post_delete" in the docs. -- Ticket URL: <https://code.djangoproject.com/ticket/27406#comment:4> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/071.ef053b16835b7ff9e68815232fd86458%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.