2009-10-02 4 views
1

Voici deux rôles: Formateur et Stagiaire. Le formateur peut avoir plusieurs stagiaires. Alors que chaque stagiaire peut avoir un seul formateur ou ne pas avoir d'entraîneur.comment concevoir un modèle pour mon cas avec django?

Voici mon modèle:

class TrainerShip(models.Model): 
    trainer = models.ForeignKey('Trainer') 
    trainee = models.ForeignKey(User) 
    request_date = models.DateTimeField(auto_now_add=True) 
    accept_date = models.DateTimeField(auto_now_add=True) 
    expiration_date = models.DateTimeField(auto_now_add=True) 

class Trainer(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    trainee = models.ManyToManyField(User, through=TrainerShip) 
    introduction = models.TextField(max_length=500) 
    certification = models.TextField(max_length=300) 
    specialties = models.TextField(max_length=300) 
    contact = models.TextField(max_length=100) 
    active = models.BooleanField(default=False) 

Je recevais l'erreur suivante en essayant de créer db:

[email protected]:~/django/sutifang$ ./manage.py syncdb Error: One or more models did not validate: registration.trainer: Accessor for field 'user' clashes with related m2m field 'User.trainer_set'. Add a related_name argument to the definition for 'user'. registration.trainer: Accessor for m2m field 'trainee' clashes with related field 'User.trainer_set'. Add a related_name argument to the definition for 'trainee'.

Toute personne a l'idée de résoudre ce problème? Y a-t-il une meilleure façon de modéliser ce genre de relation?

Répondre

3

Le problème est qu'une clé étrangère a établi une relation bidirectionnelle. Cela signifie que vous pouvez utiliser User.trainer_set pour obtenir tous les modèles Trainer sous un utilisateur, ce qui signifie que vous avez une référence circulaire à la base de données utilisateur (obtenir les modèles Trainer obtient tous ses champs, l'un de ces champs étant l'utilisateur d'origine . modèle

donc, pour corriger cela, ajoutez un argument de nom lié à la clé étrangère pour mettre fin à cette dépendance circulaire:

user = models.ForeignKey(User, unique=True, related_name='traineruser') 

Vous pouvez remplacer traineruser quelque chose qui ne possède pas déjà une table dans la base de données

+0

Merci beaucoup, c'est la première fois que je pose une question ici Merci encore! – user182863

Questions connexes