2015-10-20 1 views
0

Parmi mes modèles, j'ai Exercice qui a un lien m2m à Workout. J'ai aussi WorkoutPlan et LogBook qui sont des types de séances d'entraînement. WorkoutPlan est l'endroit où les entraînements idéaux sont stockés. LogBook est l'endroit où un utilisateur stocke l'entraînement qu'ils ont réellement terminé. Ils peuvent également lier un LogBook à un WorkoutPlan pour indiquer que la performance réelle a été connectée à un plan idéal original.Requête de l'enfant du modèle donné héritage django et lien m2m au parent

class Exercise(NameDescModel): 
    muscles = models.ManyToManyField(Muscle, blank=True) 
    groups = models.ManyToManyField(Group, blank=True) 
    priority_score = models.DecimalField(max_digits=5, decimal_places=3, editable=False, default = 0) 
    frequency = models.IntegerField() 
    time_period = models.CharField(max_length=2, choices=TIME_PERIOD_CHOICES,default=WEEK) 
    last_p_calc_date = models.DateField("Date of Last Priority Recalculation", blank=True, null=True, default=datetime.now) 

class Workout(NameDescModel): 
    exericises = models.ManyToManyField(Exercise, through='Measurement') 

class WorkoutPlan(Workout): 

    priority_score = models.DecimalField(max_digits=5, decimal_places=3, editable=False, default = 0) 
    frequency = models.IntegerField() 
    time_period = models.CharField(max_length=2, choices=TIME_PERIOD_CHOICES,default=WEEK) 
    time_estimate = models.IntegerField() 
    last_p_calc_date = models.DateField("Date of Last Priority Recalculation", blank=True, null=True, default=datetime.now) 

class LogBook(Workout): 
    workout_date = models.DateField(default=datetime.now) 
    notes = models.TextField(blank=True) 

    workout_plan = models.ForeignKey(WorkoutPlan, blank=True, null=True) 

Pour un exercice donné, je veux tirer tous les WorkoutPlans que l'exercice est.

exercise_list = Exercise.objects.order_by('-last_p_calc_date') 

for exercise in exercise_list: 
    print exercise 
    workout_list = [] 
    for workout in exercise.workout_set.all(): 
     workout_list.append(workout) 
    print list(set(workout_list)) 
    print "" 

Je me rends compte que la liste des séances d'entraînement comprennent à la fois WorkoutPlans et parce que l'exercice est des journaux de bord attaché à Workout, pas à WorkoutPlans ou LogBooks spécifiquement.

Comment puis-je tirer des séances d'entraînement qui ne sont affiliées qu'à WorkoutPlans?

Répondre

0

Je pense que vous avez sur-utilisé l'héritage ici.

Je suppose que vous vouliez mettre le champ exercises dans un modèle de base car WorkoutPlan et LogBook ont tous deux ce champ. Mais il semble que dans la réalité WorkoutPlan et LogBook sont différents types de choses, plutôt que des sous-types de Workout.

Peut-être ne vous besoin du champ exercises sur le modèle LogBook du tout, car il a une clé étrangère à WorkoutPlan qui semble un endroit judicieux d'enregistrer les exercices ... sauf si vous voulez enregistrer la différence entre le plan et des exercices réellement effectués?

Je le modèle comme celui-ci:

class Exercise(NameDescModel): 
    muscles = models.ManyToManyField(Muscle, blank=True) 
    groups = models.ManyToManyField(Group, blank=True) 
    priority_score = models.DecimalField(max_digits=5, decimal_places=3, editable=False, default = 0) 
    frequency = models.IntegerField() 
    time_period = models.CharField(max_length=2, choices=TIME_PERIOD_CHOICES,default=WEEK) 
    last_p_calc_date = models.DateField("Date of Last Priority Recalculation", blank=True, null=True, default=datetime.now) 

class WorkoutPlan(Workout): 
    exercises = models.ManyToManyField(Exercise, through='Measurement') 
    priority_score = models.DecimalField(max_digits=5, decimal_places=3, editable=False, default = 0) 
    frequency = models.IntegerField() 
    time_period = models.CharField(max_length=2, choices=TIME_PERIOD_CHOICES,default=WEEK) 
    time_estimate = models.IntegerField() 
    last_p_calc_date = models.DateField("Date of Last Priority Recalculation", blank=True, null=True, default=datetime.now) 

class LogBook(Workout): 
    exercises = models.ManyToManyField(Exercise, through='Measurement') 
    workout_date = models.DateField(default=datetime.now) 
    notes = models.TextField(blank=True) 
    workout_plan = models.ForeignKey(WorkoutPlan, blank=True, null=True) 

Vous pouvez alors interroger soit WorkoutPlans ou les journaux de bord d'une instance Exercice:

exercise_list = Exercise.objects.order_by('-last_p_calc_date') 

for exercise in exercise_list: 
    print exercise 
    workout_list = exercise.workoutplan_set.all() 
    print "" 
+0

Merci pour cela. Oui, je veux garder l'exercice attaché à LogBook au cas où la séance d'entraînement réelle diffère du plan (y compris ou en excluant certains exercices). Et oui, j'ai joint l'exercice à Workout parce que je me suis dit que si WorkoutPlan et Logbook l'utilisaient, je devais hériter. Je vais réviser cependant parce que cela me permettra de faire ce dont j'ai besoin. –