Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Comment utiliser correctement l'héritage avec Django

+2 votes

model.py

class Member(models.Model):
    user = models.OneToOneField(User)
    adress = models.TextField(default = '')
    phone_number = models.IntegerField(default = '')
    team = models.ForeignKey(Team)
    is_admin = models.BooleanField(default = 'false')

    class Meta:
        abstract = True

"""
" Player
"""
class Player(Member):
    weight = models.DecimalField(max_digits = 5, decimal_places = 2);
    height = models.DecimalField(max_digits = 5, decimal_places = 2);
    first_position = models.ForeignKey(Position, related_name =
    'first_position')
    second_position = models.ForeignKey(Position,default=None, null=True,
            blank=True, related_name =
    'second_position')

    def __str__(self):
        return self.user.username

class Coach(Member):
    squad = models.ForeignKey(Squad)
    position = models.ForeignKey(Position,default=None, null=True, blank=True,
            related_name = 'position')

    def __str__(self):
        return self.user.username

view.py

class ListPlayerAndCoach(ListView):
    template_name = "staffManagement/playerAndCoach_list.html"

    def get_context_data(self, **kwargs):
        context = super(ListPlayerAndCoach, self).get_context_data(**kwargs)
        context['coach'] = Coach.objects.filter(team =
                self.request.user.player.team)
        return context


    def get_queryset(self):
        return Player.objects.filter(team =
                self.request.user.player.team)

Je veux récupérer le champs team associé à la classe abstraite membre depuis une classe user,
comment faire pour que je n'ai pas à tester tous les fils de la classe membre pour savoir qu'elle est la l'équipe associée à l'utilisateur ?

Que je n'ai pas à faire comme ça en spécifiant le modèle :

 Coach.objects.filter(team = self.request.user.player.team)
 Player.objects.filter(team = self.request.user.player.team)
demandé 26-Jan-2016 par Echel8n (246 points)

J'aurai mis le champ team ds la classe Player, et j'aurais une relation "un-à-plusieurs" entre la classe Coach et la classe Player.

merci de votre réponse mais je ne veux pas car un joueur n'est finalement pas un coach mais un membre de l'equipe.

Imaginons que je veuille rajouter une classe médecin, je ne pourrais pas car je ne veux pas connaître la taille ou le poid ou même le poste d'un médecin ou d'un coach...

Dans ma proposition, Player et Coach sont bien differents. Si je connais un Player alors je connais sa Team. Et si je connais tous les Player d'un Coach, alors je sais quels sont les Team pr un Coach donné. Si tu dois ajouter une classe Medecin, elle etendra la classe Member. Peut etre que je n'ai rien compris a ce que tu essayes de realiser.

En fait tous les membres sont triées par équipe, techniquement l’élément qui les relis et la classe Team.
Du coup si je suis votre méthode, je devrai faire en sorte que chaque player, coach aient une relation "un à plusieurs" avec une équipe. Néanmoins ca ne résout pas mon problème.

Je ne sais pas si ce que je veux est faisable mais en gros si je faisais une analogie avec le JAVA, j'aurais une interface qui me permettrait une certaine abstraction et de ne pas me soucier de ce qui ce situe en dessous.

que dis-tu de ça ?

Je l'ai lu mais je ne vois toujours pas comment faire...

Ceci dit c'est particulier la parce qu'il y a une relation avec la base de données...

J’aimerais seulement faire en sorte de récupérer le champs team qui est dans la classe abstraite membre sans devoir me soucier de ce qu'il y a en dessous ..

Mais pourquoi est-ce que Membre doit être abstrait? S'il ne l'est pas cela résout ton problème.

1 Réponse

+1 vote
 
Meilleure réponse

Le problème ici est la définition du problème : l'héritage n'as pas lieu d'être

En effet, le fait d'être un membre d'une équipe est indépendant de son profile.

On devrait donc avoir:

Une table qui représente les membres.

Une table qui represente le profile des joueurs.

Une table qui représente le profile des coach.

Et chaque table est lié à l'objet utilisateur.

Ensuite, il faut une table Team, et une relation many-to-many à entre les membre et la table Team, avec une notion de date et de role (coach, joueur, etc) sur la table intermédiare qui peut même contenir une generic relation version coach ou joueur si le besoin d'en fait sentir.

Ceci permet en effet :

  • de séparer la notion de membre et la notion d'équipe. Elle ne sont pas liées.
  • d'avoir des coachs et des membres qui appartiennent à plusieurs équipe, ou aucune, et d'avoir un historique de ces appartenance.
  • répondre à la question "quelles sont les équipes de l'utilisateur" en faisant : Team.objects.filter(daterange=[start, now], membersuser=request.user).

Donc ici le problème n'est pas comment utiliser l'héritage, mais tout simplement qu'il ne faut pas utiliser l'héritage.

répondu 3-Fev-2016 par Sam (5,000 points)
sélectionné 10-Fev-2016 par Echel8n
...