Django Model Instance как шаблон для другой модели, которая заполняется моделями

Я пытаюсь создать приложение для отслеживания тренировок, в котором пользователь может:

  1. Создайте экземпляр модели 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)
  1. Создайте 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
    )

Но на этом я застрял. Я не уверен, как действовать дальше. Моя интуиция подсказывает одно из следующих:

  1. Мне нужно создать более простую архитектуру для этого. Приму любые предложения.
  2. .
  3. Мне нужно создать метод в модели, который решает эту проблему. Если это так, то я не уверен, как это будет выглядеть на самом деле.

Любая помощь здесь будет очень признательна!

При создании нового объекта 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

Вернуться на верх