提问人:Flacype 提问时间:8/10/2020 更新时间:8/10/2020 访问量:46
有没有办法将同一个对象多次添加到多对多字段
Is there a way to add many times the same object to many to many fields
问:
我正在构建一个应用程序,其中我有一个模型通过多对多关系链接到另一个模型。下面是一个示例: 我有一个运动训练课程,由多个练习组成,例如:
- 短跑
- 罚款
- 罚款
- 短跑
当我将我的练习添加到我的会话时,它们被添加到前面(角度),但是当我刷新我的页面时,每个练习只有一个副本保留在会话对象中。
以下是模型:
class Exercice(models.Model):
name = models.CharField(max_length=255)
class Session(models.Model):
sequences = models.ManyToManyField(Exercice, null=True, blank=True)
关于如何在一次会话中进行多次相同练习的任何想法?
答:
1赞
Mehmet Öztürk
8/10/2020
#1
您正在尝试创建一种历史表类型,而不是实际映射。您可以添加一个中间件模型,如下所示。
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)
2赞
Ben Boyer
8/10/2020
#2
这是因为 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')
评论
0赞
Flacype
8/10/2020
如果我需要按精确的顺序添加,有没有办法说第一个练习是一个冲刺,第三个练习也是一个冲刺?
1赞
Ben Boyer
8/10/2020
您需要在会话中为每个练习创建一个新的 ExerciceSession 条目。并按顺序创建它们,因此当您检索它们时,您可以按顺序对它们进行排序,您将拥有正确的会话序列created_at
0赞
Flacype
8/10/2020
经过测试,它如我所愿地完美运行!多谢!
评论