2011-01-11 11 views
18

estoy recibiendo un choque en el campo de mis modelos:related_name Django para el campo choca

class Visit(models.Model): 
    user = models.ForeignKey(User) 
    visitor = models.ForeignKey(User) 

Error: One or more models did not validate: 
profiles.visit: Accessor for field 'user' clashes with related field 'User.visit_set'. Add a related_name argument to the definition for 'user'. 
profiles.visit: Accessor for field 'visitor' clashes with related field 'User.visit_set'. Add a related_name argument to the definition for 'visitor'. 

lo que sería un 'related_field' razonable utilizar en el campo de visitante? Este modelo básicamente representa las visitas que tienen lugar a un perfil de usuario particular de .

¿También debería reemplazar alguna de las ForeignKey con ManyToManyField? La lógica es un poco confusa.

Editar: Esto parece solucionarlo, pero no estoy seguro si es lo que quiero. :)

class Visit(models.Model): 
     user = models.ForeignKey(User) 
     visitor = models.ForeignKey(User, related_name='visitors') 

Respuesta

9

Si una visita es un concepto fuerte en su aplicación, entonces tendría sentido tener la forma que ha definido: visita consiste en un 'user user' y un "visitante usuario.

Si, sin embargo, una visita es sólo una forma en la que los usuarios relacionarse entre sí, entonces tal vez debería tener una relación entre ManyToMany usuarios. Para ese propósito, probablemente debería usar ManyToManyField.symmetrical en un User Profile (en el cual extiende la información que viene con auth.models.User).

En cualquier caso, con respecto a la related_name, es posible que sea disable the backwards relation si no va a acceder a las visitas del usuario , o usa un nombre sensata como visits_to_self en user y visits_to_others en visitor, lo que haría permite ver quién visitó a un usuario llamando al user.visits_to_self y a quién visitó el usuario por user.visits_to_others.

28

Cuando se tiene un ForeignKey, se crea una propiedad denominada con el nombre del modelo más _set al modelo de referencia. El problema aquí es que ambas claves externas quieren crear una propiedad en User llamada visit_set. La solución es agregar nombres relacionados que son diferentes para cada clave externa.

Normalmente utilizo plurales para nombres relacionados. En casos como estos, añado una cláusula "como" al nombre relacionado:

class Visit(models.Model): 
    user = models.ForeignKey(User, related_name="visitsAsUser") 
    visitor = models.ForeignKey(User, related_name="visitsAsVisitor") 

Usted no quiere un ManyToManyField menos que se puede tener cero o más visitantes al Visit o usuarios por Visit.

+5

Para ser pedante, probablemente sería mejor adherirse a las convenciones de nombres de Django. Entonces, '" visitsAsUser "' sería algo así como '" visits_as_user "'. Yo personalmente preferiría '" user_visits "', pero eso es solo preferencia personal. – Johndt6

+0

La adhesión a las convenciones de Django también evita que las cosas en el administrador parezcan divertidas. Pero tenía un montón de código que usaba la convención de casos de camello en ese momento, por lo que el hábito se hizo cargo. –

+1

Simplemente pensé que valía la pena mencionarlo :) Convenciones de nombres hace que sea más fácil no solo para el público, sino también para la autora leer el código. – Johndt6

Cuestiones relacionadas