我正在为我正在开发的项目创建主题设置。我希望用户能够创建多个主题(数据库中的行),但一次只有一个主题处于活动状态。
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)
首先将该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
| 归档时间: |
|
| 查看次数: |
3644 次 |
| 最近记录: |