Je souhaite créer un objet contenant 2 liens vers des utilisateurs. Par exemple:
class GameClaim(models.Model):
target = models.ForeignKey(User)
claimer = models.ForeignKey(User)
isAccepted = models.BooleanField()
mais j'obtiens les erreurs suivantes lors de l'exécution du serveur:
L'accesseur du champ «cible» entre en conflit avec le champ associé «User.gameclaim_set». Ajoutez un argument related_name à la définition de «cible».
L'accesseur du champ «claimer» est en conflit avec le champ associé «User.gameclaim_set». Ajoutez un argument related_name à la définition de 'claimer'.
Pouvez-vous s'il vous plaît expliquer pourquoi j'obtiens les erreurs et comment les corriger?
python
django
django-models
Oleg Tarasenko
la source
la source
related_name
dans la documentation] ** ( docs.djangoproject.com/en/dev/ref/models/fields/#arguments ) expliquera pourquoi ils se produisent.Réponses:
Vous avez deux clés étrangères pour l'utilisateur. Django crée automatiquement une relation inverse entre l'utilisateur et GameClaim, ce qui est généralement le cas
gameclaim_set
. Cependant, comme vous avez deux FK, vous en auriez deuxgameclaim_set
attributs, ce qui est évidemment impossible. Vous devez donc indiquer à Django le nom à utiliser pour la relation inverse.Utilisez l'
related_name
attribut dans la définition FK. par exemplela source
Le
User
modèle essaie de créer deux champs avec le même nom, un pour lesGameClaims
qui ont celaUser
comme letarget
, et un autre pour lesGameClaims
qui ont celaUser
comme leclaimer
. Voici la documentation surrelated_name
, qui est la manière de Django de vous permettre de définir les noms des attributs afin que ceux générés automatiquement ne soient pas en conflit.la source
L'OP n'utilise pas de classe de base abstraite ... mais si vous l'êtes, vous constaterez que le codage en dur du nom_relié dans le FK (par exemple ..., related_name = "myname") entraînera un certain nombre de ces erreurs de conflit - un pour chaque classe héritée de la classe de base. Le lien fourni ci-dessous contient la solution de contournement, qui est simple, mais certainement pas évidente.
À partir de la documentation django ...
Plus d'infos ici .
la source
Parfois, vous devez utiliser un formatage supplémentaire
related_name
- en fait, à chaque fois que l'héritage est utilisé.Pas de conflit ici, mais related_name est défini une fois et Django se chargera de créer des noms de relation uniques.
puis dans les enfants de la classe Value, vous aurez accès à:
la source
Il semble que je rencontre cela occasionnellement lorsque j'ajoute un sous-module en tant qu'application à un projet django, par exemple compte tenu de la structure suivante:
Si j'ajoute ce qui suit à INSTALLED_APPS:
Django semble traiter le fichier myapp.mymodule models.py deux fois et renvoie l'erreur ci-dessus. Cela peut être résolu en n'incluant pas le module principal dans la liste INSTALLED_APPS:
Inclure le
myapp
au lieu demyapp.module
entraîne la création de toutes les tables de la base de données avec des noms incorrects, donc cela semble être la bonne façon de le faire.Je suis tombé sur ce post en cherchant une solution à ce problème, alors je me suis dit que je mettrais ça ici :)
la source
En ajoutant simplement à la réponse de Jordan (merci pour le conseil Jordan), cela peut également arriver si vous importez le niveau au-dessus des applications, puis importez les applications, par exemple
myproject/ apps/ foo_app/ bar_app/
Donc, si vous importez des applications, foo_app et bar_app, vous pourriez avoir ce problème. J'avais des applications, foo_app et bar_app, toutes répertoriées dans les paramètres.INSTALLED_APPS
Et vous voulez quand même éviter d'importer des applications, car alors vous avez la même application installée dans 2 espaces de noms différents
apps.foo_app
etfoo_app
la source