有没有一种方法可以将多次相同的对象添加到多对多字段中



我正在构建一个应用程序,通过多对多关系将一个模型链接到另一个模型。以下是一个示例:我有一个运动训练课程,由多个练习组成,例如:

  1. 冲刺
  2. 罚款
  3. 罚款
  4. Sprint

当我将我的exercise添加到会话中时,它们会添加在前面(有角度(,但当我刷新页面时,会话对象中只保留每个exercise的一个副本。

以下是型号:

class Exercice(models.Model):
name = models.CharField(max_length=255)
class Session(models.Model):
sequences = models.ManyToManyField(Exercice, null=True, blank=True)

你知道如何在一次训练中多次进行相同的锻炼吗?

这是因为m2m只包含id,而不是您想要它们的次数和顺序。

这个问题似乎更多地与您的数据库结构有关。

似乎您需要一个新表来存储这些信息。

class Exercice(models.Model):
name = models.CharField(max_length=255)
class Session(models.Model):
exercices = models.ManyToManyField(Exercice, null=True, blank=True)
class Sequence(models.Model):
exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE)
session = models.ForeignKey(Session, on_delete=models.CASCADE)
#any extra info there
repetitions = models.PositiveSmallIntegerField(blank=True, null=True) #how many time each?
created_at = models.DateTimeField(auto_now_add=True) # used to generate the sequence of exercices

然后你可以循环浏览这个表,得到你想要的东西。

因此,在您的后端,当您创建会话时,您还应该为其中的每个练习创建序列条目

您现在可以通过查看以下内容访问序列:

session = Session.objects.get(id=1#eg)
sequence = session.sequence_set.order_by('created_at')

您正试图创建一种实际上没有映射的历史表类型。您可以添加一个中间件模型,如下所示。

class ExerciseHistory(models.Model):
exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE)
session = models.ForeignKey(Session, on_delete=models.CASCADE)
created_date = models.DateTimeField(auto_now_add=True)

最新更新