2015-10-20 2 views
0

Среди моих моделей у меня есть упражнение, у которого есть ссылка m2m на тренировку. У меня также есть WorkoutPlan и LogBook, которые являются типами тренировок. WorkoutPlan - это место, где хранятся идеальные тренировки. LogBook - это то место, где пользователь сохраняет тренировку, которую они фактически выполнили. Они также могут связывать LogBook с WorkoutPlan, чтобы указать, что фактическая производительность была связана с оригинальным идеальным планом.Запрос от ребенка модели данного джанго-наследования и m2m ссылка на родителя

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) 

Для данного упражнения, я хочу, чтобы вытащить все из WorkoutPlans, что упражнения в.

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 "" 

Я понял, что список тренировок включает как WorkoutPlans и вахтенные журналы, потому что упражнения прилагается к Workout, а не к WorkoutPlans или LogBooks специально.

Как я могу вытащить тренировки, которые связаны только с WorkoutPlans?

ответ

0

Я думаю, что вы использовали чрезмерное наследство здесь.

Я думаю, вы хотели поместить поле exercises в базовую модель, потому что WorkoutPlan и LogBook оба имеют это поле. Но, похоже, на самом деле WorkoutPlan и LogBook - это разные вещи, а не подтипы Workout.

Возможно, вам не нужно exercises поля на LogBook модели вообще, так как он имеет внешний ключ к WorkoutPlan, который кажется разумным место для записи упражнений ... если вы не хотите, чтобы записать разницу между планом и упражнения фактически выполнены?

Я бы моделировать это следующим образом:

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) 

Вы можете запросить либо WorkoutPlans или журналы из экземпляра Упражнение:

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

Спасибо за это. Да, я хочу, чтобы упражнения прилагались к LogBook в случае, если фактическая тренировка отличается от плана (включая или исключая определенные упражнения). И да, я привязал упражнение к тренировке, потому что я решил, что если оба WorkoutPlan и Logbook использовали его, я должен наследовать. Я буду пересматривать, потому что это позволит мне делать то, что мне нужно. –

 Смежные вопросы

  • Нет связанных вопросов^_^