Django 模型中只有一行可以有 active = True

Bon*_*nes 0 python django

我正在为我正在开发的项目创建主题设置。我希望用户能够创建多个主题(数据库中的行),但一次只有一个主题处于活动状态。

class SingleActiveModel(models.Model):

    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        # Save active = False to all other rows or alternative
        super(SingleActiveModel, self).save(*args, **kwargs)

class Theme(SingleActiveModel):
    some_setting = models.SomeField()
    active = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

bru*_*ers 5

首先将该active字段放入您的基类中 - 它是使用它的基类,因此它不应该依赖于声明它的子类。

然后它只是在必要时更新其他记录active字段值的大师:

class SingleActiveModel(models.Model):
    active = models.BooleanField(default=False)

    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        if self.active:
            # select all other active items
            qs = type(self).objects.filter(active=True)
            # except self (if self already exists)
            if self.pk:
                qs = qs.exclude(pk=self.pk)
            # and deactive them
            qs.update(active=False) 

        super(SingleActiveModel, self).save(*args, **kwargs)


class Theme(SingleActiveModel):
    # the active field is inherited
    some_setting = models.SomeField()
Run Code Online (Sandbox Code Playgroud)

并不是说这不能解决“每个用户一个活动项目”的问题,但解决方案更简单,参见 tzaman 的评论:

只需有一个主题模型,然后在用户(或某些设置模型)中放置一个代表活动主题的 FK