Problema con dni, es único pero no es obligatorio

121 views
Skip to first unread message

Lucho Flores

unread,
Sep 20, 2013, 12:04:40 AM9/20/13
to djan...@googlegroups.com
Tengo un sistema donde guardo el dni, este campo es único, pero no es obligatorio guardarlo en la base de datos. Puede ser que algunas personas de mi sistema(niños) no posean aún el dni, por lo que se guarda como cadena vacía en mi base de datos, ahora bien, al guardarse vacío el dni, la base de datos ya reconoce como dato único a una cadena vacía y no me permite guardar más registros que no posean dni, porque dice que ya existe uno en la base de datos. Cómo puedo solucionar este problema???

el dni está declarado así:

dni = models.CharField(unique=True, max_length=10, null=True, blank=True)

Julián Cortés

unread,
Sep 20, 2013, 1:43:06 AM9/20/13
to djan...@googlegroups.com
¿qué hace ud cuando recibe los datos?
se me hace raro que si no guarda nada, no se pueda volver a guardar, tenga en cuenta que es diferente una cadena vacía a un valor nulo



--
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a django-es+...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.



--
           pity

01110000 01101001 01110100 01111001

Hiko hitokiri

unread,
Sep 20, 2013, 2:44:39 AM9/20/13
to djan...@googlegroups.com
lo mas fácil seria que modificaras el clean  de el formulario para que si la persona es mayor de edad tire un error si no se llena el dni  y ya . y para lo de único  pues ahi tendrías que hacer un query  para revisar  si el campo  se repite 

Juan Ignacio

unread,
Sep 20, 2013, 3:49:53 AM9/20/13
to djan...@googlegroups.com
La base de datos que tengas debajo es la que te está imponiendo esa restricción. Que, por otro lado, es prefectamente lógica; si el campo es único no puede haber dos nulos. La única solución que se me ocurre es redefinir el campo como no único. Seguramente tendras que eliminar algun índice y alguna constraint de la base de datos o, si puedes, exporta los datos, borra la tabla, que Django vuelva a crearla y luego importa otra vez los datos. Gestiona tu mismo la validacion de unicidad en los casos en que el DNI si esté incluido con código propio.

Ten en cuenta que, si en tu base de datos vas a tener muchas personas, los DNI, de hecho, no son únicos, hay muchos casos de duplicidad de DNI en España, creo recordar que del orden de unos 100.000. Si vas a tener, digamos, un millón de personas en tus tablas, es casi seguro que te vas a encontrar con algun caso de DNI duplicado "real".





2013/9/20 Hiko hitokiri <las...@gmail.com>
lo mas fácil seria que modificaras el clean  de el formulario para que si la persona es mayor de edad tire un error si no se llena el dni  y ya . y para lo de único  pues ahi tendrías que hacer un query  para revisar  si el campo  se repite 

--
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a django-es+...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.



--
Juan Ignacio Rodríguez de León
Móvil: 605 890514
E-Mail: euri...@gmail.com
http://www.metriz.com/
http://descon2.com/
http://www.elornitorrincoenmascarado.com/

Alexis Roda

unread,
Sep 20, 2013, 9:14:14 AM9/20/13
to djan...@googlegroups.com
Al 20/09/13 09:49, En/na Juan Ignacio ha escrit:
> La base de datos que tengas debajo es la que te est� imponiendo esa
> restricci�n. Que, por otro lado, es prefectamente l�gica; si el campo es
> �nico no puede haber dos nulos.

Seg�n el est�ndar al evaluar NULL = NULL el resultado es a su vez NULL
(tiene su l�gica si pensamos en NULL como "desconocido") y por tanto no
se considera que exista duplicidad cuando dos registros tienen el valor
NULL en un campo declarado UNIQUE.

Otra cosa muy distinta es cuando el valor es la cadena vac�a, como han
comentado en un mensaje anterior.


Ramiro Morales

unread,
Sep 20, 2013, 9:31:36 AM9/20/13
to djan...@googlegroups.com
2013/9/20 Lucho Flores <luchito...@gmail.com>:
>
> el dni está declarado así:
>
> dni = models.CharField(unique=True, max_length=10, null=True, blank=True)

2013/9/20 Alexis Roda <alexis.roda...@gmail.com>:

> Según el estándar al evaluar NULL = NULL el resultado es a su vez NULL
> (tiene su lógica si pensamos en NULL como "desconocido") y por tanto no se
> considera que exista duplicidad cuando dos registros tienen el valor NULL en
> un campo declarado UNIQUE.
>
> Otra cosa muy distinta es cuando el valor es la cadena vacía, como han
> comentado en un mensaje anterior.

Exacto, es probable que en realidad el ORM Django esté aplicando su
política de preferir que los CharFields sin valor se guarden como ''
en lugar de como NULLs. Si se desea que almacene NULL, a lo mejor se
puede usar default=NULL, no tengo tiempo de probarlo ahora.

Para una comparativa de uso de NULL entre los dtos. RDBMS ver
https://www.sqlite.org/nulls.html

--
Ramiro Morales
@ramiromorales

Juan Ignacio Rodríguez De León

unread,
Sep 20, 2013, 3:43:35 PM9/20/13
to djan...@googlegroups.com
Muy interesante la página de comparativas de uso de NULL, pensaba que todos los gestores trataban este caso -NULL en un campo único- del mismo modo, pero veo que no es así, gracias por la aclaración.

Con respecto al problema inicial, se podría entonces poner null=true en la definición del campo, pero entiendo que la solución entonces depende de que el gestor de base de datos que tengas por debajo acepte estos múltiples nulos como valores diferentes. en resumen, si he entendido bien, tienes dos opciones:

Si lo resuelves tu, con jquery, por ejemplo, tienes que trabajar más pero te funciona en cualquier base de datos.

Si tu SGBD lo soporta, puedes usar null=True, pero te puede dar problemas si en un futuro migras a otro sistema gestor.

--
Juan Ignacio Rodríguez de León
Euri...@gmail.com
jileon en Twitter
Reply all
Reply to author
Forward
0 new messages