tutorial personalizados formularios example avanzados django primary-key models instances

personalizados - Las claves principales de las instancias modelo Django no se restablecen a 1 después de que se eliminan todas las instancias



formularios personalizados django (6)

¿Los dejaste de tu base de datos o los eliminaste usando Django? Django no cambiará AUTO_INCREMENT para su tabla simplemente borrando filas de ella, por lo que si desea restablecer sus claves principales, es posible que deba ingresar a su base de datos y:

ALTER TABLE <my-table> AUTO_INCREMENT = 1;

(Esto supone que estás usando MySQL o similar).

He estado trabajando en una versión fuera de línea de mi aplicación web Django y con frecuencia he eliminado instancias de modelos para un determinado ModelX.

Lo he hecho desde la página de administración y no he tenido problemas. El modelo solo tiene dos campos: nombre y orden y ninguna otra relación con otros modelos.

A las nuevas instancias se les proporciona el siguiente pk disponible, que tiene sentido, y cuando eliminé todas las instancias, agregar una nueva instancia produce un pk = 1, que espero.

Moviendo el código en línea a mi base de datos real, noté que este no es el caso. Necesitaba cambiar las instancias del modelo, así que las borré todas, pero para mi sorpresa, las claves principales continuaron incrementándose sin volver a establecer el valor 1.

Ingresé a la base de datos utilizando la API de Django que he verificado y las instancias anteriores se han ido, pero incluso al agregar nuevas instancias, obtengo una clave principal que selecciona dónde quedó la última instancia eliminada, en lugar de 1.

Preguntándose si alguien sabe cuál podría ser el problema aquí.


Como otros han declarado, esto es enteramente responsabilidad de la base de datos.

Pero debes darte cuenta de que este es el comportamiento deseable . Un ID identifica de manera única una entidad en su base de datos. Como tal, solo debería referirse a una fila. Si esa fila se elimina posteriormente, no hay ninguna razón por la que desee una nueva fila para volver a usar esa ID: si lo hiciera, crearía una confusión entre la entidad que ahora eliminó que solía tener esa ID, y la uno recién creado que lo reutiliza. No tiene sentido hacer esto y no deberías querer hacerlo.


No hay problema, así funcionan las bases de datos. Django no tiene nada que ver con la generación de identificadores, solo le dice a la base de datos que inserte una fila y obtiene la identificación en respuesta de la base de datos. La identificación comienza en 1 para cada tabla y se incrementa cada vez que inserta una fila. Eliminar filas no hace que la identificación vuelva atrás. Por lo general, no debería preocuparse por eso, todo lo que necesita saber es que cada fila tiene una identificación única.
Por supuesto, puede cambiar el contador que genera la identificación para su tabla con un comando de base de datos y eso depende del sistema de base de datos específico que esté utilizando.


Yo no lo llamaría un problema. Este es el comportamiento predeterminado para muchos sistemas de bases de datos. Básicamente, el contador de incremento automático para una tabla es persistente, y la eliminación de entradas no afecta el contador. El valor real de la clave principal no afecta el rendimiento ni nada, solo tiene un valor estético (si alguna vez alcanza el límite de 2 mil millones, es probable que tenga otros problemas de los que preocuparse).

Si realmente desea restablecer el contador, puede soltar y volver a crear la tabla:

python manage.py sqlclear <app_name> > python manage.py dbshell

O bien, si necesita conservar los datos de otras tablas en la aplicación, puede restablecer manualmente el contador:

python manage.py dbshell mysql> ALTER TABLE <table_name> AUTO_INCREMENT = 1;

La razón más probable por la que ve un comportamiento diferente en sus aplicaciones fuera de línea y en línea es que el valor de incremento automático solo se almacena en la memoria, no en el disco. Se vuelve a calcular como MAX(<column>) + 1 cada vez que se reinicia el servidor de la base de datos. Si la tabla está vacía, se reiniciará por completo al reiniciar. Probablemente esto sea muy frecuente para su entorno fuera de línea, y casi ninguno para su entorno en línea.


No estoy seguro de cuándo se agregó, pero el siguiente comando de administración eliminará todos los datos de todas las tablas y restablecerá los contadores de incremento automático a 1.

./manage.py sqlflush | psql DATABASE_NAME


Si está utilizando SQLite, puede restablecer la clave principal con los siguientes comandos de shell:

ELIMINAR DE your_table; ELIMINAR DE SQLite_sequence WHERE name = ''your_table'';