主键

时间:2015-10-06 15:23:47

标签: django django-models django-forms django-admin

目前我有三种型号:

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'),但它没有用。

2 个答案:

答案 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字段。