Django 有没有办法将同一对象多次添加到多对多字段中

Django 有没有办法将同一对象多次添加到多对多字段中,django,django-models,django-rest-framework,Django,Django Models,Django Rest Framework,我正在构建一个应用程序,通过多对多关系将一个模型链接到另一个模型。以下是一个例子: 我有一个运动训练课程,由多个练习组成,例如: 冲刺 惩罚 惩罚 冲刺 当我将练习添加到会话时,它们会添加在前面(角度),但当我刷新页面时,会话对象中只保留每个练习的一个副本 以下是模型: class Exercice(models.Model): name = models.CharField(max_length=255) class Session(models.Model): sequen

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

  • 冲刺
  • 惩罚
  • 惩罚
  • 冲刺
  • 当我将练习添加到会话时,它们会添加在前面(角度),但当我刷新页面时,会话对象中只保留每个练习的一个副本

    以下是模型:

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

    您知道如何在一个会话中多次进行相同的练习吗?

    您正在尝试创建一种实际上不映射的历史记录表。您可以在下面添加一个中间件模型

        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)
    

    这是因为m2m只包含ID,而不是您需要多少次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')
    

    如果我需要添加一个精确的顺序,有没有办法说第一个练习是一个冲刺,第三个练习也是一个冲刺?你需要在你的训练中为每个练习创建一个新的练习项。然后按顺序创建它们,这样当您检索它们时,您就可以按处创建的对它们进行排序,在测试之后您就可以获得会话序列,它就像我希望的那样完美地工作!谢谢!