queryset one on_delete many foreign example _set mysql django orm foreign-keys

mysql - on_delete - foreign key django one to many



Django "No se puede agregar o actualizar una fila secundaria: falla una restricción de clave externa" (6)

Algunas de mis tablas estaban en InnoDB y algunas estaban en MyISAM ... Cambié todo a MyISAM y el problema fue resuelto.

Tengo un Coupon modelo y una Photo modelo con una ForeignKey :

class Photo(models.Model): coupon = models.ForeignKey(Coupon, related_name=''description_photos'') title = models.CharField(max_length=100) image = models.ImageField(upload_to=''images'')

Configuré líneas en el administrador así que ahora puedo agregar fotos a un cupón del administrador.

Intento agregar uno, y la carga es exitosa, pero luego obtengo la página de depuración de Django con este error:

IntegrityError at /admin/coupon/coupon/321/ (1452, ''Cannot add or update a child row: a foreign key constraint fails (`my_project`.`coupon_photo`, CONSTRAINT `coupon_id_refs_id_90d7f06` FOREIGN KEY (`coupon_id`) REFERENCES `coupon_coupon` (`id`))'')

¿Qué es esto y cómo puedo resolver este problema?

(Si es importante, esta es una base de datos MySQL).

EDITAR: Lo probé en una base de datos Sqlite3 que tiene un conjunto de datos ligeramente diferente, y funcionó, ¿así que tal vez haya datos sueltos en mi DB actual? ¿Cómo puedo encontrarlo y eliminarlo?


En algún momento, el motivo de este error es intentar guardar primero la tabla secundaria y luego guardar el elemento primario.
La solución para esto es usar

DATABASES = { ''default'': { ... ''OPTIONS'': { "init_command": "SET foreign_key_checks = 0;", }, } }

2). Verifique el flujo de operación de su base de datos y conviértalo en parent ---> child


Me encontré con este mismo problema: la solución de mmrs151 funciona, pero NB que, para Django <= 1.2 ( es decir, antes del soporte de múltiples bases de datos), la configuración se ve así:

DATABASE_OPTIONS = {"init_command": "SET foreign_key_checks = 0;"}

Vale la pena señalar que Ram Rachum parece haber funcionado en lugar de resolver el problema: MyISAM no admite transacciones en absoluto ...


Otra opción es eliminar el contratiempo en su tabla MySQL:

alter table <TABLE_NAME> drop foreign key <CONTRAINT_NAME>;


Para evitar que esto suceda, lo que también puede hacer es configurar su STORAGE_ENGINE en su settings.py

para django> = 1.2

DATABASES = { ''default'': { ... ''STORAGE_ENGINE'': ''MyISAM / INNODB / ETC'' } }

para django <= 1.2

DATABASE_STORAGE_ENGINE = "MyISAM / INNODB / ETC"

Tenga en cuenta que esto solo es válido para MySQL


DATABASES = { ''default'': { ... ''OPTIONS'': { "init_command": "SET foreign_key_checks = 0;", }, } }

( Según el documento oficial ) En versiones anteriores de Django, los dispositivos con referencias avanzadas (es decir, relaciones con filas que aún no se han insertado en la base de datos) no se cargarían cuando se utiliza el motor de almacenamiento InnoDB. Esto se debió al hecho de que InnoDB se desvía del estándar de SQL verificando las restricciones de clave externa de forma inmediata en lugar de aplazar el control hasta que se confirma la transacción. Este problema ha sido resuelto en Django 1.4.