我怎样才能让模型在Django中独一无二

时间:2018-06-17 14:57:36

标签: django django-models

我想拥有3款TvSeries,Season和Episode。 如果特定的TvSeries,任何剧集应该仅适用于一个季节,并且该特定季节应仅适用于一个TvSeries 我正在定义我的模型

class Movie(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField(unique=True)


class Season(models.Model):
    season = models.PositiveIntegerField()
    title = models.CharField(max_length=255, blank=True)
    movie = models.ForeignKey(Movie,on_delete=models.CASCADE)

class Episode(models.Model):
    episode = models.PositiveIntegerField()
    title = models.CharField(max_length=255, blank=True)
    season = models.ForeignKey(Season,on_delete=models.CASCADE)
    movie = models.ForeignKey(Movie,on_delete=models.CASCADE)

但是在这种情况下,任何季节都可以用于任何一集,每一集我都可以选择一个季节和一个完全不同的TvSeries这样:

testfilm1 -> season1(id=1) -> episode 1
testfilm2-> season(id=1) -> episode 2

testfilm1的季节可以是任何其他电影中的用户。 我尝试使用unique_together但没有机会。

1 个答案:

答案 0 :(得分:0)

  

testfilm1的季节可以是任何其他电影中的用户。我尝试使用unique_together但没有机会。

不,您已在ForeignKey中向Season添加了Movie,这意味着每个Season都与相关联正好一个 Movie(如果您添加null=True,则可以将其链接到 Movie

当然,如果我们反过来关注关系,则意味着Movie可以一个更多 Season附加了Season,每个Episode可以一个更多 {{1}附在它上面。但这似乎合乎逻辑。但Episode只能属于完全一个SeasonSeason只能属于一个 Movie

但奇怪的是,您从ForeignKeyEpisode定义了Movie。这没有任何意义,因为电影只是遵循Season然后到Movie的路径。因此,您可能删除 movie模型上的Episode属性。

如果您经常查询movie的{​​{1}},我们可以定义一个属性,例如:

Episode

因此,您描述的层次是不可能的。它是:

class Episode(models.Model):
    episode = models.PositiveIntegerField()
    title = models.CharField(max_length=255, blank=True)
    season = models.ForeignKey(Season,on_delete=models.CASCADE)

    @property
    def movie(self):
        return Movie.objects.get(season__episode=self)

或者是:

testfilm 1 -> season 1 -> episode 1
testfilm 1 -> season 1 -> episode 2