Как обрабатывать данные из одного поля модели в другое - PullRequest
2 голосов
/ 02 июля 2019

У меня есть модели Exercise, Training и Workout.

Training содержит некоторые упражнения (Exercise)

Workout содержит тренировки (Training).

Фрагмент моей модели.py:

class Exercise(models.Model):
    user = models.ForeignKey(User, related_name='exercises',
                             on_delete=models.CASCADE)
    name = models.CharField(max_length=80)
    description = models.TextField(max_length=300)
    details = models.ManyToManyField(ExerciseDetail, blank=True)
...


class Training(models.Model):
    user = models.ForeignKey(User, related_name='trainings',
                             on_delete=models.CASCADE)
    name = models.CharField(max_length=80)
    description = models.CharField(max_length=250)
    exercises = models.ManyToManyField(Exercise, related_name='trainings',
                                       blank=True)
...


class Workout(models.Model):
    user = models.ForeignKey(User, related_name='workouts',
                             on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now=True)
    name = models.CharField(max_length=200)
    description = models.TextField(max_length=400, blank=True)
    trainings = models.ManyToManyField(Training, related_name='workouts',
                                       blank=True)
...

Я хотел бы иметь возможность использовать что-то вроде Workout.objects.get(name='workout').exercises.objects.all(), чтобы получить список / набор всех упражнений, включенных в тренингивыбранной тренировки.

Я также хотел бы иметь возможность использовать exercises`` field with Django Rest Framework to list all exercises, possibly with link to particular Exercise``` сериализатор модели.

Может кто-нибудь дать подсказку, как я могу это сделать?

1 Ответ

0 голосов
/ 02 июля 2019

Вы можете запросить это с помощью:

Exercise.objects.filter(
    <b>trainings__workouts__name='workout'</b>
)

С помощью последовательных подчеркиваний (__) вы можете просматривать «сквозные» отношения.

Таким образом, будет возвращено Exercise s, которые принадлежат Training s, которые принадлежат Workout s с именем 'Workout'.

...