繁体   English   中英

Django 管理员 - 一对多 - 如何确保只有一个孩子选择了 boolean 字段

[英]Django Admin - One to Many - How to make sure only one children has a boolean field selected

在 django 中,我有以下型号:

class System(models.Model):
    name = models.CharField(max_length=200)
    """ ... many other fields, not useful for here ..."""
    # Would it make more sense to have the primary instance here ?  
    

class Instance(models.Model):
    name = models.CharField(max_length=200)
    url = models.UrlField(max_length=200)
    system = models.ForeignKey(System, on_delete=models.PROTECT)
    is_production = models.BooleanField()
    

使用管理员管理此数据。 我想要的是,当系统的一个实例被标记为 is_production 时,该系统的所有其他实例都将其 is_production 字段更新为 False。

另外,我对如何为这种情况最好地设置管理员感兴趣。 我将使用内联来编辑/创建实例。

但是,我不确定如何确保每个系统在生产中只能有一个实例。

  • 我应该使用系统上的下拉菜单来 select 生产实例并使用formfield_for_foreignkey过滤吗?
  • 使用管理员操作,例如: Mark as production
  • 保存后使用信号?
  • 还有其他我没有想过的方法吗?

你问了多个问题,但我将专注于我解释为主要的问题:

我想要的是,当系统的一个实例被标记为 is_production 时,该系统的所有其他实例都将其 is_production 字段更新为 False。

重写 Instance 模型的保存方法怎么样?

class Instance(models.Model):
    name = models.CharField(max_length=200)
    url = models.URLField(max_length=200)
    system = models.ForeignKey(System, on_delete=models.PROTECT)
    is_production = models.BooleanField()

    def save(self, *args, **kwargs):
        if self.is_production:
            self.system.instance_set.exclude(id=self.id).update(is_production=False)
        super().save(*args, **kwargs)

这确保了每当保存 is_production=True 的 Instance 实例时,链接到相关系统 object 的所有其他 Instance 实例将其 is_production 值更新为 False。

根据您 go 关于更改 Instance 实例的 is_production 值的方式,这可能适合也可能不适合您想要做的事情。 例如,请参阅此线程,讨论如何使用 .update() 方法不会导致调用 save() 方法: Django.update 不调用覆盖保存? (也在Django 文档中描述,在链接的线程中提到)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM