目前我有三种型号:
class Tutorial(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
videos = models.ManyToManyField('TutorialVideo', through='TutorialVideoThrough', blank=True)
class TutorialVideo(models.Model):
name = models.CharField(max_length=100)
video = S3DirectField(dest='tutorial_vids')
length = models.CharField("Length (hh:mm:ss)",max_length=100)
tutorials = models.ManyToManyField(Tutorial, through='TutorialVideoThrough', blank=True)
class TutorialVideoThrough(models.Model):
tutorial = models.ForeignKey(Tutorial, related_name='tutorial_video_through', blank=True, null=True)
video = models.ForeignKey(TutorialVideo, related_name='video_tutorial_through', blank=True, null=True)
order = models.IntegerField()
教程可以通过TutorialVideoThrough获得许多TutorialVideos。在TutorialVideoThrough上,我有一个order
字段来决定显示视频的顺序。有没有办法验证没有重复的顺序整数?例如,如果我通过TutorialVideoThrough将两个TutorialVideos链接到TutorialVideo,并且我将第一个作为顺序1,那么我就不能将第二个视频作为顺序1。
我尝试在TutorialVideoThrough上使用unique_together = ('id', 'order')
,但它没有用。
答案 0 :(得分:4)
primary_key
始终是唯一的,因此您的unique_together对也将始终是唯一的。
如果您必须确保没有相同订单的视频,您必须先回答问题:关于什么?
如果您希望TutorialVideo
中的Tutorial
列表具有唯一性,则unique_together
应为:
unique_together = (('tutorial', 'order'),)
如果您希望Tutorial
中的TutorialVideo
列表具有唯一性,则unique_together
应为:
unique_together = (('video', 'order'),)
但是将order
设置为唯一不是一个好主意,在尝试重新排序字段时会遇到一些问题。
答案 1 :(得分:2)
如果您希望每个order
的每个tutorial
都是唯一的,那么您需要
unique_together = (
('tutorial', 'order'),
)
您可能希望每个视频在每个教程中只出现一次。如果是这种情况,请将('tutorial', 'video')
添加到unique_together
。
unique_together = (
('tutorial', 'order'),
('tutorial', 'video'),
)
请注意,您应该只在模型的一侧定义多对多关系。如果你有
class Tutorial(models.Model):
videos = models.ManyToManyField('TutorialVideo', through='TutorialVideoThrough', blank=True, related_name='tutorials')
然后您应该从tutorial
模型中删除TutorialVideo
字段。