template examples bootstrap python django django-models

python - examples - include django



Django: ¿Por qué algunos campos de modelos chocan entre sí? (7)

El OP no usa una clase base abstracta ... pero si lo es, encontrará que la codificación dura del nombre_relacionado en el FK (por ejemplo ..., nombre_relacionado = "mi nombre") dará como resultado un número de estos errores de conflicto - uno para cada clase heredada de la clase base. El enlace proporcionado a continuación contiene la solución alternativa, que es simple, pero definitivamente no es obvia.

De los documentos django ...

Si está utilizando el atributo related_name en ForeignKey o ManyToManyField, siempre debe especificar un nombre inverso único para el campo. Esto normalmente causaría un problema en las clases base abstractas, ya que los campos de esta clase se incluyen en cada una de las clases secundarias, con exactamente los mismos valores para los atributos (incluido el nombre relacionado) cada vez.

Más información aquí .

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 obtengo los siguientes errores cuando ejecuto el servidor:

  • El accesorio para el campo ''objetivo'' choca con el campo relacionado ''User.gameclaim_set''. Agregue un argumento related_name a la definición de ''objetivo''.

  • El acceso del campo ''claimer'' choca con el campo relacionado ''User.gameclaim_set''. Agregue un argumento related_name a la definición de ''claimer''.

¿Puedes explicar por qué estoy recibiendo los errores y cómo solucionarlos?


El modelo de User está tratando de crear dos campos con el mismo nombre, uno para los GameClaims que tienen ese User como target , y otro para los GameClaims que tienen ese User como el claimer . Aquí están los documentos sobre related_name , que es la manera en que Django le permite establecer los nombres de los atributos para que los autogenerados no entren en conflicto.


En ocasiones, debe usar formato adicional en related_name , en realidad, en cualquier momento cuando se usa la herencia.

class Value(models.Model): value = models.DecimalField(decimal_places=2, max_digits=5) animal = models.ForeignKey( Animal, related_name="%(app_label)s_%(class)s_related") class Meta: abstract = True class Height(Value): pass class Weigth(Value): pass class Length(Value): pass

No hay conflicto aquí, pero related_name se define una vez y Django se encargará de crear nombres de relación únicos.

luego, en los niños de la clase Value, tendrás acceso a:

herdboard_height_related herdboard_lenght_related herdboard_weight_related


Me parece encontrar esto ocasionalmente cuando agrego un submódulo como una aplicación a un proyecto django, por ejemplo, con la siguiente estructura:

myapp/ myapp/module/ myapp/module/models.py

Si agrego lo siguiente a INSTALLED_APPS:

''myapp'', ''myapp.module'',

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:

''myapp.module'',

La inclusión de myapp lugar de myapp.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.

Me encontré con esta publicación mientras buscaba una solución a este problema, así que pensé en poner esto aquí :)


Simplemente agregando la respuesta de Jordan (gracias por el consejo Jordan) también puede suceder si importas el nivel arriba de las aplicaciones y luego importas las aplicaciones, por ejemplo:

myproject/ apps/ foo_app/ bar_app/

Entonces, si está importando aplicaciones, foo_app y bar_app, puede obtener este problema. Tenía aplicaciones, foo_app y bar_app, todas en la configuración.INSTALLED_APPS

Y desea evitar la importación de aplicaciones de todos modos, porque entonces tiene la misma aplicación instalada en 2 espacios de nombres diferentes

apps.foo_app y foo_app


Tienes dos claves foráneas para el usuario. Django crea automáticamente una relación inversa entre el usuario y GameClaim, que generalmente es gameclaim_set . Sin embargo, debido a que tienes dos FK, tendrías dos atributos gameclaim_set , lo cual es obviamente imposible. Entonces debes decirle a Django qué nombre usar para la relación inversa.

Use el atributo related_name en la definición de FK. p.ej

class GameClaim(models.Model): target = models.ForeignKey(User, related_name=''gameclaim_targets'') claimer = models.ForeignKey(User, related_name=''gameclaim_users'') isAccepted = models.BooleanField()


Yo tuve el mismo problema. Usando run python manage.py makemigrations "appname" lo arregló por mí. Borré accidentalmente algunos archivos de migración. No es necesario volver a eliminar ningún archivo.