Tengo problemas para cargar los accesorios de Django en mi base de datos MySQL debido a conflictos de tipos de contenido. Primero intenté descargar los datos solo de mi aplicación de esta manera:
./manage.py dumpdata escola > fixture.json
pero seguía teniendo problemas de claves foráneas faltantes, porque mi aplicación "escola" usa tablas de otras aplicaciones. Seguí agregando aplicaciones adicionales hasta que llegué a esto:
./manage.py dumpdata contenttypes auth escola > fixture.json
Ahora el problema es la siguiente violación de la restricción cuando trato de cargar los datos como un dispositivo de prueba:
IntegrityError: (1062, "Duplicate entry 'escola-t23aluno' for key 2")
Parece que el problema es que Django está intentando recrear dinámicamente tipos de contenido con diferentes valores de clave primaria que entran en conflicto con los valores de clave primaria del dispositivo. Esto parece ser el mismo que el error documentado aquí: http://code.djangoproject.com/ticket/7052
El problema es que la solución alternativa recomendada es volcar la aplicación contenttypes que ya estoy haciendo. ¿Lo que da? Si hace alguna diferencia, tengo algunos permisos de modelo personalizados como se documenta aquí: http://docs.djangoproject.com/en/dev/ref/models/options/#permissions
-e contenttypes -e auth.permission
con--natural
? Lo intenté sin la--natural
opción y funcionó. Además, la documentación aquí dice que se debe usar esta opción si DUMPINGauth.permission
ycontenttypes
.ContentType
yPermission
no está garantizado para conseguir mismo ID que tenían antes. Su volcado de datos contiene identificadores que pueden hacer referencia a diferentes objetos en otra base de datos donde cargará los datos. Podría funcionar para usted debido a una de estas razones: 1) sus datos no tenían ninguna referencia a estos objetos 2) se conservaron los identificadores originales de Permission / ContentTypes 3) su carga de datos tuvo éxito pero en realidad tiene datos corruptos debido a objetos refiriéndose a objetos incorrectos y aún no lo sabe--natural
ahora está obsoleta a favor de--natural-foreign
(y--natural-primary
)manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission --indent 4 > project_dump.json
--natural
ahora se ha eliminado por completo, no solo en desuso. Utilice--natural-foreign
o en su--natural-primary
lugar.Sí, esto es realmente irritante. Durante un tiempo lo solucioné haciendo un "restablecimiento de manage.py" en la aplicación contenttypes antes de cargar el dispositivo (para deshacerme de los datos de contenttypes generados automáticamente que diferían de la versión descargada). Eso funcionó, pero finalmente me cansé de las molestias y de los accesorios abandonados por completo a favor de los volcados SQL directos (por supuesto, luego pierdes la portabilidad de la base de datos).
actualizar : la mejor respuesta es usar la
--natural
bandera paradumpdata
, como se indica en una respuesta a continuación. Esa bandera aún no existía cuando escribí esta respuesta.fuente
Intente omitir los tipos de contenido al crear el accesorio:
Me funcionó en una situación similar para las pruebas unitarias, ¡su conocimiento sobre los tipos de contenido realmente ayudó!
fuente
Las respuestas aquí son todas viejas ... A partir de 2017, la mejor respuesta es:
fuente
No estaba usando MySQL, sino que estaba importando algunos datos de un servidor en vivo a sqlite. Borrar los
contenttypes
datos de la aplicación antes de realizar el procesoloaddata
funcionó:Y entonces
fuente
Resolví este problema en mis casos de prueba restableciendo la aplicación contenttypes de la prueba unitaria antes de cargar mi archivo de volcado. Carl sugirió esto ya usando el
manage.py
comando y yo hago lo mismo solo usando elcall_command
método:Mi
full_test_data.json
dispositivo contiene el volcado de la aplicación contenttypes que corresponde al resto de los datos de prueba. Al restablecer la aplicación antes de cargarla, evita la clave duplicadaIntegrityError
.fuente
Esto funciona para mi. Aquí estoy excluyendo todo lo que burbujea en los modelos reales.
fuente
Debe utilizar claves naturales para representar cualquier clave externa y relaciones de varios a varios. Además, podría ser una buena idea excluir la
session
tabla en lasessions
aplicación y lalogentry
tabla en laadmin
aplicación.Django 1.7+
Django <1.7
Según la documentación de Django ,
--natural
se ha desaprobado en la versión 1.7, por lo que la opción--natural-foreign
debería usarse en su lugar.También puede omitir la clave principal en los datos serializados de este objeto, ya que se puede calcular durante la deserialización pasando la
--natural-primary
marca.fuente
cambiará
a
Y el accesorio funciona por
TestCase
ahorafuente
Django 2.2.5
Me ayudó
fuente
Voy a dar otra posible respuesta que acabo de descubrir. Quizás ayude al OP, quizás ayude a alguien más.
Tengo una tabla de relaciones de muchos a muchos. Tiene una clave primaria y las dos claves foráneas para las otras tablas. Descubrí que si tengo una entrada en el dispositivo cuyas dos claves externas son iguales a otra entrada que ya está en la tabla con un pk diferente , fallará. Las tablas de relaciones M2M tienen un "conjunto único" para las dos claves externas.
Entonces, si se trata de una relación M2M que se está rompiendo, mire las claves externas que está agregando, mire su base de datos para ver si ese par de FK ya figura en una PK diferente.
fuente
Es muy, muy molesto ... Esto me muerde cada vez.
Traté de volcar datos con --exclude contenttypes y --natural, siempre tengo problemas ...
Lo que funciona mejor para mí es simplemente hacer un
truncate table django_content_type;
después de syncdb y LUEGO cargar los datos.Por supuesto, para la carga automática initial_data.json, estás en caída libre.
fuente
A veces me había encontrado con un error similar. Resultó que estaba intentando cargar los dispositivos antes de crear las tablas necesarias. Así que lo hice:
Y funcionó como un encanto
fuente
En mi caso, había descargado los datos de
auth
(./manage.py dumpddata auth > fixtures/auth.json
) para usar el dispositivo con fines de prueba.El desarrollo continuó y eliminé la mayoría de los modelos que había definido
models.py
y fue entonces cuando comencé a ver este molesto problema.Mi solución fue volver a regenerar el accesorio auth.json. Este había eliminado muchas entradas
auth.permission
relacionadas con los modelos antiguos que tenía.fuente
Probé todos los métodos de arriba, nada funcionó para mí. Tengo que excluir el modelo de autenticación completo y funciona bien.
fuente