Bajo el capó, ¿cuál es la diferencia entre subclasificar al usuario y crear un campo uno a uno?

Quiero implementar usuarios en mi sistema. Sé que Django ya tiene un sistema de autenticación y he estado leyendo la documentación. Pero no sé todavía la diferencia entre

from django.contrib.auth.models import User class Profile(User): # others fields 

Y

 from django.contrib.auth.models import User class Profile(models.Model): user = models.OneToOneField(User) # others fields 

No quiero saber por qué usar uno u otro, sino qué sucede debajo de los capuchones. ¿Cual es la diferencia?

Su primer ejemplo es la herencia de tablas múltiples .

 class Profile(User): 

Si tiene un profile , puede acceder a todos los campos del modelo de usuario directamente (por ejemplo, profile.username y profile.email ). En este caso, Django crea un OneToOneField automáticamente.

El segundo ejemplo es un OneToOneField regular.

 class Profile(models.Model): user = models.OneToOneField(User) 

En este caso, no puede acceder a profile.username y profile.email . En su lugar, accede a estos campos a través del campo uno a uno (por ejemplo, profile.user.username y profile.user.email ).

En su caso, donde está agregando un modelo de perfil, evitaría usar la herencia y, en su lugar, utilizaría el campo uno a uno. El modelo de User tiene administradores personalizados para manejar las contraseñas. Si utiliza la herencia de varias tablas, entonces su modelo de Profile tendría que manejar esto. Al usar un campo uno a uno, los administradores personalizados pueden manejar los campos de usuario, y los administradores de su modelo de perfil solo tienen que manejar los campos de perfil adicionales.

Otra opción es crear un modelo de usuario personalizado . En este caso, se subclase una clase abstracta AbstractUser o AbstractBaseUser lugar de la clase User . Si su clase de perfil funciona, entonces recomendaría esto en lugar del modelo de usuario personalizado, porque los modelos de usuario personalizados son más complicados de configurar.