2011-12-29 3 views
3

J'utilise Django 1.3 avec le backend de base de données MySQL 5.5. Mon hypothèse était que Django par défaut émule l'effet ON DELETE CASCADE pour les objets liés lors de la construction de la base de données via syncdb. Cependant, l'inspection de la base de données révèle que la propriété ON DELETE est en fait définie sur "RESTRICT". Est-ce un bug? Comme je ne parviens pas à supprimer les enregistrements liés, je continue à recevoir le message IntegrityError dans le djang-admin lors de la suppression d'un objet associé à un objet.Django ne paramètre pas MySQL ON DELETE = CASCADE

Merci

+0

Ce que vous avez dit est correct. Django _émule_ 'ON DELETE CASCADE'. Il n'utilise pas cette fonctionnalité de votre SGBD. Django émettra les instructions de suppression nécessaires pour supprimer les modèles associés. Vous ne savez pas pourquoi vous voyez ce problème dans l'admin. –

Répondre

2

Il semblerait que Django 1.3.1 échoue à appliquer la propriété ON DELETE CASCADE à la table. Il pourrait éventuellement avoir quelque chose à voir avec l'interface MySQL-python 1.2.3 fonctionnant sous Windows. La seule autre façon de résoudre ce problème est via custom SQL.

+1

Avoir le même problème. –

1

Django se met en cascade par défaut. Je ne suis pas vraiment sûr pourquoi vous obtenez un RESTRICTION ON DELETE. Django 1.3 vous permet de sélectionner des procédures ON DELETE alternatives (en utilisant le on_delete kwarg lors de la définition d'un champ), et il est possible que si vous avez hérité du code, quelqu'un l'ait fait auparavant et l'ait supprimé du code, mais négligé base de données.

Je suggère de modifier la colonne manuellement pour la remettre à ON DELETE CASCADE. Et continuez simplement à partir de là. Comme je l'ai dit, c'est quelque chose que le développeur doit dire à Django de ne pas faire; il cascades par défaut.

+0

C'est ma propre base de code Je n'ai jamais défini l'option on_delete sur autre chose que CASCADE. J'ai exécuté la commande python manage.py sql app_name et j'ai remarqué qu'il n'y a pas de référence à ON DELETE CASCADE. Il se passe quelque chose d'étrange, je n'arrive pas à comprendre ce que c'est. –

5

Django émule SUR SUPPRIMER CASCADE en Python - c'est pourquoi il n'a pas besoin de le définir sur les tables de base de données. En fait, la définition de RESTRICT peut même avoir un sens, car cela signifie que vous ne pouvez pas supprimer accidentellement des objets liés sans en être averti dans l'admin.

Dans votre cas, il semble que vous ayez des contraintes de clé étrangère que Django ne connaît pas - ou que vous essayez de supprimer via le SQL brut; Je ne peux pas dire de votre question.

Si le problème est que vous ne pouvez pas supprimer de l'administrateur ou de l'ORM, vous devez vous assurer que vos modèles sont définis correctement. Django s'occupera de rassembler les objets liés et d'effectuer la cascade elle-même. Si le problème est que les suppressions ne fonctionnent pas à partir du SQL brut, vous devrez d'abord supprimer manuellement les objets liés, ou relâcher la contrainte SQL - dans ce cas, le changer en cascade peut être le bon Solution.

+0

Peut-être que les choses ont changé depuis ce commentaire mais en utilisant Django 1.9, les contraintes sont définitivement créées non émulées, et créées sans cascade appliquée. – AaronM

Questions connexes