Saltar al contenido

Trabajar con clave primaria compuesta en el proyecto django con una base de datos heredada

Solución:

Desafortunadamente, django aún no tiene una clave primaria compuesta (las claves primarias compuestas también se denominan claves primarias de varias columnas)

Existe una biblioteca de terceros, como era de esperar, el nombre django-compositekey que hace posible crear un modelo que tiene una clave principal de varias columnas. Sin embargo, ese proyecto no se mantiene y no es compatible con las últimas versiones de django.

Su mejor opción es agregar una nueva columna a su tabla que sea un AutoField y convertirla en la nueva clave principal. Los campos que componen la clave principal en la actualidad se pueden marcar como unique_together. Si bien esto puede no ser ideal para algunas consultas. Es lo suficientemente bueno para la mayoría.

Si actualiza su pregunta con la estructura de la tabla actual (como se muestra en su consola SQL), actualizaré mi respuesta para mostrar cómo se verá el modelo.

Actualizar
Hay muchas formas diferentes en las que puede eliminar la clave primaria compuesta anterior y reemplazarla con una nueva clave primaria de incremento automático. Aquí está el más fácil, solo involucra SQL

CREATE TABLE newtable LIKE mytable;
ALTER TABLE newtable DROP PRIMARY KEY;
ALTER TABLE newtable ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY;
RENAME TABLE mytable to mytable_old;
RENAME TABLE newtable to mytable;
INSERT INTO mytable(userid,field1id, rest of the fields) 
    SELECT * FROM mytable_old;

Luego edite su modelo y elimine el indicador primary_key = True de esos campos.

Nota:

Algunas bases de datos como sqlite, por ejemplo, no admiten la LIKE cláusula en un CREATE TABLE. En estos casos, tendrá que buscar la declaración de creación de tabla para la tabla original y copiar y pegar después de editar el nombre de la tabla. A juzgar por la estructura de su tabla, parece que está usando mysql y es compatible con el LIKE cláusula.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *