2012-05-17 17 views
6

Necesito extender el usuario django con algunos campos adicionales. He encontrado 2 maneras diferentes allíForeignKey vs OneToOne campo django

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    #other fields 

O

class UserProfile(models.Model): 
    user = models.ForeignKey(User) 
    #other fields 

¿No son iguales? Después de sincronizarlos, no vi ninguna diferencia en la base de datos mysql

Respuesta

5

No, ¿por qué piensas eso? Una ForeignKey es una relación de uno a muchos, es decir, un usuario puede tener muchos perfiles. Un OneToOne es, como su nombre lo indica, una relación de uno a uno: un usuario solo puede tener un perfil, lo que parece más probable.

+0

Después de sincronizarlos, no vi ninguna diferencia en la base de datos mysql, me preguntaba cómo distinguir – sumit

+8

La única diferencia * en la base de datos * es una restricción única en la columna con un uno a uno. De hecho, 'OneToOneField' es simplemente' ForeignKey (unique = True) '. –

+1

No verá ninguna diferencia en su base de datos, ya que syncdb no cambia las tablas una vez que están definidas, tendrá que soltarlas y volver a crearlas. Sin embargo, puede usar 'sqlall' para mostrar las diferentes salidas, como dice Chris, OneToOne tiene una restricción única. –

4

Como dijo @Daniel Roseman, estos son 2 tipos diferentes de relaciones rdbms.

Encontrará que distingue en la situación en la que tendrá (por error probablemente) más de un perfil para un usuario determinado. En esa situación myuser.get_profile() levantará una excepción MultipleObjectsReturned, ya que esencialmente está haciendo una consulta get(), bajo el capó.

+0

+1 Buen punto. Técnicamente, puede usar una ForeignKey, pero si la configura como una protección personal personalizada, lo protegerá al generar una excepción si intenta crear más de un perfil. –

+0

@ChrisPratt Sí. Básicamente, si lo haces con una clave externa, te desvías tanto de la especificación django (ya que inutilizas get_profile), que estás mejor al nombrar a tu modelo de extensión que no sea 'UserProfile'. – rantanplan

Cuestiones relacionadas