Django Model Instance как шаблон для другой модели, которая заполняется моделями
Я пытаюсь создать приложение для отслеживания тренировок, в котором пользователь может:
- Создайте экземпляр модели
ExerciseTemplate
из списка доступных моделейExercise
. Я создал их как модели, чтобы пользователь мог создавать пользовательскиеExercises
в будущем. Существует такжеExerciseInstance
, который будет использоваться для отслеживания и измененияExerciseTemplate
, созданных пользователем или кем-то другим. Для простоты я удаляю из моделей несколько несущественных полей, но каждая содержит следующее:
class Exercise(models.Model):
# Basic Variables
name = models.CharField(max_length=128)
description = models.TextField(null=True, blank=True)
def __str__(self):
return self.name
class ExerciseTemplate(models.Model):
# Foreign Models
workout = models.ForeignKey(
'Workout',
on_delete=models.SET_NULL,
null=True,
blank=True
)
exercise = models.ForeignKey(
Exercise,
on_delete=models.SET_NULL,
null=True,
blank=True
)
recommended_sets = models.PositiveIntegerField(null=True, blank=True)
class ExerciseInstance(models.Model):
""" Foreign Models """
exercise_template = models.ForeignKey(
ExerciseTemplate,
on_delete=models.SET_NULL,
null=True,
blank=True
)
workout = models.ForeignKey(
'Workout',
on_delete=models.SET_NULL,
null=True,
blank=True
)
""" Fields """
weight = models.PositiveIntegerField(null=True, blank=True)
reps = models.PositiveIntegerField(null=True, blank=True)
- Создайте
WorkoutInstance
изWorkoutTemplate
. При этомWorkoutTemplate
состоит изExerciseTemplates
. НоWorkoutInstance
должен быть способен взятьWorkoutTemplate
и заполнить егоExerciseInstances
на основеExerciseTemplates
вWorkoutTemplate
. Вот модели, которые у меня есть на данный момент:
class WorkoutTemplate(models.Model):
name = models.CharField(max_length=128)
description = models.TextField(null=True, blank=True)
date = models.DateTimeField(null=True, blank=True)
#category...
exercises = models.ManyToManyField(
Exercise,
through=ExerciseTemplate
)
def __str__(self):
return self.name
class WorkoutInstance(models.Model):
# Foreign Models
workout_template = models.ForeignKey(
'WorkoutTemplate',
on_delete=models.SET_NULL,
null=True,
blank=True
)
Но на этом я застрял. Я не уверен, как действовать дальше. Моя интуиция подсказывает одно из следующих:
- Мне нужно создать более простую архитектуру для этого. Приму любые предложения. .
- Мне нужно создать метод в модели, который решает эту проблему. Если это так, то я не уверен, как это будет выглядеть на самом деле.
Любая помощь здесь будет очень признательна!
При создании нового объекта WorkoutInstance, который ссылается на данный объект WorkoutTemplate, вы получаете все связанные с ним объекты ExerciseTemplate. Затем вы просто создаете новый объект (строку) для каждого ExerciseInstance в другой модели (таблице)
Если вы свяжете ваш ExerciseInstance с WorkoutInstance через 'workout', вы можете сделать что-то вроде:
wt = WorkoutTemplate.get(id=1)
wi = WorkoutInstance.create(workout_template=wt)
for e in wt.exercisetemplate_set.all:
ExerciseInstance.create(exercise_template=e, workout=wi)
Вы можете внедрить это в метод, создающий новый WorkoutInstance, или взглянуть на signals
https://docs.djangoproject.com/en/4.0/topics/db/optimization/#create-in-bulk