Je travaille sur l'ajout de la prise en charge de Django 2.0 à la bibliothèque Django-pagetree . Pendant les tests automatisés, en utilisant une base de données sqlite en mémoire, je reçois un tas d'erreurs comme celle-ci:
File "/home/nnyby/src/Django-pagetree/pagetree/tests/test_models.py", line 638, in setUp
'children': [],
File "/home/nnyby/src/Django-pagetree/pagetree/models.py", line 586, in add_child_section_from_dict
...
File "/home/nnyby/src/Django-pagetree/venv/lib/python3.5/site-packages/Django/db/backends/base/base.py", line 239, in _commit
return self.connection.commit()
Django.db.utils.IntegrityError: FOREIGN KEY constraint failed
Ceci est noté dans les notes de version Django 2.0: https://docs.djangoproject.com/en/2.0/releases/2.0/#foreign-key-constraints-are- maintenant activé sur sqlite
D'après cette description, que je ne comprends pas bien, cela ne devrait pas s'appliquer aux bases de données de test qui ne sont pas persistantes, non? Mon db de test sqlite ne serait-il pas créé avec les options appropriées lors de l'utilisation de Django 2.0?
Les paramètres d'application que j'utilise pour les tests sont ici: https://github.com/ccnmtl/Django-pagetree/blob/master/runtests.py
La documentation dit deux choses:
Si vous avez des contraintes ForeignKey, elles sont désormais appliquées au niveau de la base de données. Assurez-vous donc que vous ne violez pas une contrainte de clé étrangère. C'est la cause la plus probable de votre problème, bien que cela signifie que vous auriez vu ces problèmes avec d'autres bases de données. Recherchez des modèles comme celui-ci dans votre code:
# in pagetree/models.py, line 810
@classmethod
def create_from_dict(cls, d):
return cls.objects.create() # what happens to d by the way?
Cela échouera définitivement avec une erreur de contrainte ForeignKey car un PageBlock
doit avoir section
, vous ne pouvez donc pas appeler create
sans d'abord l'assigner.
Si vous contournez la contrainte de clé étrangère en effectuant une transaction atomique (par exemple) pour différer la validation de la clé étrangère, votre clé étrangère doit être INITIALEMENT DIFFÉRÉE. En effet, votre base de données de test devrait déjà avoir cela car il est reconstruit à chaque fois.
Une situation rencontrée un peu différente avec la même erreur. Le problème est que j'utilise le même nom de modèle et le même nom de champ
CODE INCORRECT
class Column(models.Model):
...
class ColumnToDepartment(models.Model):
column = models.ForeignKey(Column, on_delete=models.CASCADE)
SULUTION
class Column(models.Model):
...
class ColumnToDepartment(models.Model):
col = models.ForeignKey(Column, on_delete=models.CASCADE)
Avez-vous ajouté on_delete à votre CLÉ ÉTRANGÈRE? Sur Django 2.0 cet argument est requis. Vous pouvez également voir: https://docs.djangoproject.com/en/2.0/ref/models/fields/#Django.db .models.ForeignKey.on_deletehttps://docs.djangoproject.com/en/2.0/howto/upgrade-version/https://docs.djangoproject.com/ fr/2.0/topics/db/examples/many_to_one /https://docs.djangoproject.com/en/2.0/ref/models/fields/#Django.db.models.ForeignKey
Je viens d'avoir cette erreur: sqlite3.IntegrityError: FOREIGN KEY constraint failed
sur mon Django. Il s'avère que j'ai supprimé le dossier des migrations quelque part le long de la ligne afin qu'il ne prenne pas en compte mes modifications de modèle lorsque j'ai exécuté python manage.py makemigrations
. Assurez-vous simplement que vous disposez toujours d'un dossier de migrations avec des migrations.