【问题标题】:Django models - how to make field from one model be dependable on field in another model (which is foreign key)?Django 模型 - 如何使一个模型中的字段依赖于另一个模型中的字段(即外键)?
【发布时间】:2012-05-20 23:56:13
【问题描述】:

我是 Django 新手,不知道如何处理以下问题:

我有模型:

class Season(models.Model):
    number_of_episodes = models.IntegerField()
class Episode(models.Model):
    season = models.ForeignKey(Season)
    number = models.IntegerField()

剧集编号不仅应在季节中唯一,而且应小于季节的 number_of_episodes。

【问题讨论】:

    标签: django django-models foreign-key-relationship


    【解决方案1】:

    要使剧集编号在季节中唯一,您可以使用unique_together。这意味着对于其中一个字段的每个值,在另一个字段中只能有一行具有值。看起来是这样的:

    class Season(models.Model):
        number_of_episodes = models.IntegerField()
    class Episode(models.Model):
        class Meta:
            unique_together = (season, number)
        season = models.ForeignKey(Season)
        number = models.IntegerField()
    

    我不认为您可以使用 django 模型来强制剧集编号应小于 season.number_of_episodes,但您可以在覆盖的保存方法中做到这一点。像这样的:

    class Season(models.Model):
        number_of_episodes = models.IntegerField()
    
    class Episode(models.Model):
        class Meta:
            unique_together = (season, number)
        season = models.ForeignKey(Season)
        number = models.IntegerField()
    
        def save(self, *args, **kwargs):
            if self.number > season.number_of_episodes:
                return #Don't save
            else:
                super(Episode, self).save(*args, **kwargs) # Call the "real" save() method.
    

    请注意,如果剧集编号不正确,这只会跳出保存方法。相反,您可能会引发异常。

    【讨论】:

    • 这很好用,但我想在剧集中添加另一个字段:actors = models.manyToManyField(Actor) 不幸的是,当我尝试添加数量过高的剧集时会引发异常: “'Episode' 实例需要有一个主键值才能使用多对多关系。”你知道为什么会这样吗?我该怎么办?
    • 也许你首先对一个对象调用 save ,然后在它上面添加一个actor。如果你添加一个剧集编号太高的剧集,模型将不会保存(如果你使用上面的代码),你会收到错误消息。这是因为 ManyToMany 字段需要一个具有主键的对象,并且对象在第一次保存时会获得一个主键。如果剧集数太高,要解决此问题,您必须退出。例如,您可以抛出异常(而不仅仅是返回)并在某处进行处理。
    • 我应该在哪里处理异常?
    猜你喜欢
    • 2019-03-11
    • 2019-02-16
    • 2011-05-21
    • 2015-09-26
    • 2010-10-18
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    相关资源
    最近更新 更多