0

私のモデルの中には、ワークアウトへの m2m リンクがあるエクササイズがあります。ワークアウトの一種である WorkoutPlan と LogBook もあります。WorkoutPlan は、理想的なワークアウトが保存される場所です。LogBook は、ユーザーが実際に完了したワークアウトを保存する場所です。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 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)

特定のエクササイズについて、そのエクササイズが含まれるすべての WorkoutPlan を取得したいと考えています。

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 と LogBooks の両方が含まれていることに気付きました。これは、エクササイズが WorkoutPlans や LogBooks ではなく、Workout に関連付けられているためです。

WorkoutPlans のみに関連するワークアウトを取得するにはどうすればよいですか?

4

1 に答える 1

0

ここで継承を使いすぎたと思います。

両方ともそのフィールドを持っているため、exercisesフィールドを基本モデルに入れたかったと思います。しかし、実際にはサブタイプではなく、さまざまなタイプのもののように見えます。WorkoutPlanLogBookWorkoutPlanLogBookWorkout

演習を記録するのに適切な場所と思われる外部キーがあるためexercises、モデルのフィールドはまったく必要ない可能性があります...計画と実際に実行された演習の違いを記録したい場合を除きますか?LogBookWorkoutPlan

私はそれを次のようにモデル化します:

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)

その後、Exercise インスタンスから WorkoutPlans または LogBooks のいずれかを照会できます。

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

for exercise in exercise_list:
    print exercise
    workout_list = exercise.workoutplan_set.all()
    print ""
于 2015-10-20T15:28:13.360 に答える