Quiero crear un objeto que contenga 2 enlaces a usuarios. Por ejemplo:
class GameClaim(models.Model):
target = models.ForeignKey(User)
claimer = models.ForeignKey(User)
isAccepted = models.BooleanField()
pero recibo los siguientes errores al ejecutar el servidor:
El descriptor de acceso para el campo 'destino' choca con el campo relacionado 'User.gameclaim_set'. Agregue un argumento related_name a la definición de 'target'.
El descriptor de acceso para el campo 'claimer' choca con el campo relacionado 'User.gameclaim_set'. Agregue un argumento related_name a la definición de 'claimer'.
¿Puede explicar por qué recibo los errores y cómo solucionarlos?
python
django
django-models
Oleg Tarasenko
fuente
fuente
related_name
en la documentación] ** ( docs.djangoproject.com/en/dev/ref/models/fields/#arguments ) explicará por qué ocurren.Respuestas:
Tienes dos claves foráneas para el usuario. Django crea automáticamente una relación inversa desde el Usuario hasta GameClaim, que generalmente es
gameclaim_set
. Sin embargo, debido a que tiene dos FK, tendría dosgameclaim_set
atributos, lo que obviamente es imposible. Por lo tanto, debe decirle a Django qué nombre usar para la relación inversa.Use el
related_name
atributo en la definición FK. p.ejfuente
El
User
modelo está intentando crear dos campos con el mismo nombre, uno para losGameClaims
que tienen esoUser
como eltarget
, y otro para losGameClaims
que tienen esoUser
como elclaimer
. Aquí están los documentosrelated_name
, que es la forma en que Django le permite establecer los nombres de los atributos para que los autogenerados no entren en conflicto.fuente
El OP no está usando una clase base abstracta ... pero si lo está, encontrará que codificar el nombre_configurado en el FK (por ejemplo ..., nombre_conocido = "mi nombre") dará como resultado varios de estos errores de conflicto. - uno para cada clase heredada de la clase base. El enlace que se proporciona a continuación contiene la solución, que es simple, pero definitivamente no es obvia.
De los documentos de django ...
Más información aquí .
fuente
A veces tiene que usar un formato adicional, en
related_name
realidad, en cualquier momento cuando se usa la herencia.Aquí no hay conflicto, pero related_name se define una vez y Django se encargará de crear nombres de relación únicos.
luego, en los hijos de la clase Value, tendrá acceso a:
fuente
Parece que me encuentro con esto ocasionalmente cuando agrego un submódulo como aplicación a un proyecto django, por ejemplo, dada la siguiente estructura:
Si agrego lo siguiente a INSTALLED_APPS:
Django parece procesar el archivo myapp.mymodule models.py dos veces y arroja el error anterior. Esto se puede resolver al no incluir el módulo principal en la lista INSTALLED_APPS:
La inclusión de en
myapp
lugar demyapp.module
hace que todas las tablas de la base de datos se creen con nombres incorrectos, por lo que esta parece ser la forma correcta de hacerlo.Encontré esta publicación mientras buscaba una solución a este problema, así que pensé en poner esto aquí :)
fuente
Simplemente agregando a la respuesta de Jordan (gracias por el consejo de Jordan) también puede suceder si importa el nivel por encima de las aplicaciones y luego importa las aplicaciones, por ejemplo
myproject/ apps/ foo_app/ bar_app/
Entonces, si está importando aplicaciones, foo_app y bar_app, entonces podría obtener este problema. Tenía aplicaciones, foo_app y bar_app, todas listadas en la configuración.
Y de todos modos, desea evitar importar aplicaciones, porque entonces tiene la misma aplicación instalada en 2 espacios de nombres diferentes
apps.foo_app
yfoo_app
fuente