首页 > 解决方案 > 如何确保单个模型只有一个 BooleanField 为真?

问题描述

我有一个 django 项目,其中有一个 Videos 模型。在我的索引模板页面上,我只想显示一个视频,即 isFeatured 等于 true 的视频。每当我将另一个视频的 isFeatured 属性更改为 true 时,它​​应该使前一个视频的该属性为 false。

我已经检查了有关此的其他 stackoverflow 问题,但所有这些问题都在处理外键,而我的模型更简单,我认为有一个更简单的解决方案。

这就是我的模型的样子:

class Video(models.Model):
    url = models.URLField(max_length=200)
    isFeatured = models.BooleanField(default=False)

    def __str__(self):
        return self.url

标签: django

解决方案


如果您真的不想或不能创建另一个模型,那么您唯一的解决方案就是通过代码来处理它。

解决此问题的唯一方法是必须使用代码更改行。

为了做到这一点,请创建一个执行此操作的函数并在任何地方使用它,而不是重写代码以避免错误。

video_isfeatured_changer(video_id):
    # Change isFeatured for other featured videos to False.
    featured_videos = Video.objects.filter(isFeatured=True).update(isFeatured=False)

    video = Video.objects.get(pk=video_id)
    video.isFeatured = True
    video.save()

您还可以覆盖模型的save()方法Video


推荐阅读