J'ai du mal à charger les fixtures Django dans ma base de données MySQL en raison de conflits de types de contenu. J'ai d'abord essayé de vider les données de mon application uniquement comme ceci:
./manage.py dumpdata escola > fixture.json
mais j'ai continué à avoir des problèmes de clé étrangère manquante, parce que mon application "escola" utilise des tables d'autres applications. J'ai continué à ajouter des applications supplémentaires jusqu'à ce que j'arrive à ceci:
./manage.py dumpdata contenttypes auth escola > fixture.json
Maintenant, le problème est la violation de contrainte suivante lorsque j'essaie de charger les données en tant que montage de test:
IntegrityError: (1062, "Duplicate entry 'escola-t23aluno' for key 2")
Il semble que le problème soit que Django essaie de recréer dynamiquement des types de contenu avec différentes valeurs de clé primaire qui sont en conflit avec les valeurs de clé primaire de l'appareil. Cela semble être le même que le bogue documenté ici: http://code.djangoproject.com/ticket/7052
Le problème est que la solution de contournement recommandée consiste à vider l'application contenttypes, ce que je fais déjà!? Ce qui donne? Si cela fait une différence, j'ai des autorisations de modèle personnalisées telles que documentées ici: http://docs.djangoproject.com/en/dev/ref/models/options/#permissions
-e contenttypes -e auth.permission
avec--natural
? J'ai juste essayé sans l'--natural
option et cela a fonctionné. La documentation ici indique également qu'il faut utiliser cette option si DUMPINGauth.permission
etcontenttypes
.ContentType
etPermission
ne sont pas garantis d'obtenir le même identifiant qu'avant. Votre vidage de données contient des identifiants qui peuvent référencer différents objets sur une base de données plutôt que dans laquelle vous allez charger des données. Cela pourrait fonctionner pour vous pour l'une de ces raisons: 1) vos données ne faisaient aucune référence à ces objets 2) les identifiants originaux de Permission / ContentTypes ont été préservés 3) vos données de chargement ont réussi mais vous avez en fait des données corrompues en raison d'objets se référant à de mauvais objets et vous ne le savez pas encore--natural
est désormais obsolète au profit de--natural-foreign
(et--natural-primary
)manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission --indent 4 > project_dump.json
--natural
a maintenant été complètement supprimé, pas seulement obsolète. Utilisez--natural-foreign
ou à la--natural-primary
place.Oui, c'est vraiment irritant. Pendant un certain temps, j'ai contourné ce problème en effectuant une «réinitialisation manage.py» sur l'application contenttypes avant de charger l'appareil (pour me débarrasser des données contenttypes générées automatiquement qui différaient de la version sauvegardée). Cela a fonctionné, mais finalement je suis tombé malade des tracas et des montages abandonnés entièrement en faveur de vidages SQL directs (bien sûr, vous perdez la portabilité de la base de données).
mise à jour - la meilleure réponse est d'utiliser le
--natural
drapeau pourdumpdata
, comme indiqué dans une réponse ci-dessous. Ce drapeau n'existait pas encore lorsque j'ai écrit cette réponse.la source
Essayez d'ignorer les types de contenu lors de la création d'un appareil:
Cela a fonctionné pour moi dans une situation similaire pour les tests unitaires, votre compréhension des types de contenu m'a vraiment aidé!
la source
Les réponses ici toutes anciennes ... À partir de 2017, la meilleure réponse est:
la source
Je n'utilisais pas MySQL mais importais plutôt des données d'un serveur live dans sqlite. Effacer les
contenttypes
données de l' application avant de procéder aloaddata
fait l'affaire:Puis
la source
J'ai résolu ce problème dans mes scénarios de test en réinitialisant l'application contenttypes à partir du test unitaire avant de charger mon fichier de vidage. Carl a déjà suggéré cela en utilisant la
manage.py
commande et je fais la même chose uniquement en utilisant lacall_command
méthode:Mon
full_test_data.json
appareil contient le vidage de l'application contenttypes qui correspond au reste des données de test. En réinitialisant l'application avant le chargement, il empêche la clé en doubleIntegrityError
.la source
Cela fonctionne pour moi. Ici, j'exclus tout ce qui concerne les modèles réels.
la source
Vous devez utiliser des clés naturelles pour représenter les clés étrangères et les relations plusieurs-à-plusieurs. De plus, il peut être judicieux d'exclure le
session
tableau dans l'sessions
application et lelogentry
tableau dans l'admin
application.Django 1.7+
Django <1,7
Selon la documentation de Django ,
--natural
a été déconseillée dans la version 1.7, donc l'option--natural-foreign
doit être utilisée à la place.Vous pouvez également omettre la clé primaire dans les données sérialisées de cet objet car elle peut être calculée lors de la désérialisation en passant l'
--natural-primary
indicateur.la source
changera
à
Et le luminaire fonctionne pour l'
TestCase
instantla source
Django 2.2.5
ça m'a aidé
la source
Je vais donner une autre réponse possible que je viens de trouver. Peut-être que cela aidera l'OP, peut-être que cela aidera quelqu'un d'autre.
J'ai une table de relations plusieurs-à-plusieurs. Il a une clé primaire et les deux clés étrangères vers les autres tables. J'ai trouvé que si j'ai une entrée dans l'appareil dont les deux clés étrangères sont les mêmes qu'une autre entrée déjà dans le tableau avec un autre pk , cela échouera. Les tables de relations M2M ont un «ensemble unique» pour les deux clés étrangères.
Donc, si c'est une relation M2M qui se rompt, regardez les clés étrangères qu'elle ajoute, regardez votre base de données pour voir si cette paire de FK est déjà répertoriée sous un PK différent.
la source
C'est vraiment, vraiment ennuyeux ... Je suis mordu par ça à chaque fois.
J'ai essayé de vider des données avec --exclude contenttypes et --natural, j'ai toujours des problèmes.
Ce qui fonctionne le mieux pour moi est simplement de faire un
truncate table django_content_type;
après la synchronisation et ALORS charger les données.Bien sûr, pour le chargement automatique initial_data.json, vous êtes tombé en panne.
la source
J'avais rencontré une erreur similaire il y a parfois. Il s'est avéré que j'essayais de charger les appareils avant de créer les tables nécessaires. Alors j'ai fait:
Et ça a fonctionné comme un charme
la source
Dans mon cas, j'avais vidé les données de
auth
(./manage.py dumpddata auth > fixtures/auth.json
) pour utiliser l'appareil à des fins de test.Le développement s'est poursuivi et j'ai supprimé la plupart des modèles que j'avais définis dans
models.py
et c'est à ce moment-là que j'ai commencé à voir ce problème ennuyeux.Ma solution était de régénérer à nouveau l'appareil auth.json. Celui-ci avait supprimé beaucoup d'entrées
auth.permission
liées aux anciens modèles que j'avais.la source
J'ai essayé toutes les méthodes d'en haut, rien n'a fonctionné pour moi. Je dois exclure le modèle d'authentification complet et fonctionne très bien.
la source