Django Admin-一对多-如何确保只有一个子项选择了布尔字段

Django Admin-一对多-如何确保只有一个子项选择了布尔字段,django,django-admin,Django,Django Admin,在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 ?

在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

此外,我感兴趣的是如何最好地设置这个案件的管理员。一、 将使用内联线编辑/创建实例

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

  • 我是否应该使用系统上的下拉列表来选择生产实例,并使用
    formfield\u for\u foreignkey
    进行筛选
  • 使用管理操作,例如:
    标记为生产
  • 保存后使用信号
  • 还有什么我没有想到的方法吗

您提出了多个问题,但我将重点讨论我所理解的主要问题:

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

覆盖实例模型的save方法怎么样

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的实例实例时,链接到相关系统对象的所有其他实例实例的is_production值都将更新为False


根据您如何更改实例的is_生产值,这可能适合您想要做的事情,也可能不适合您想要做的事情。见e。G本线程讨论了如何使用.update()方法不会导致调用save()方法:(在中也有描述,在链接的线程中有提及)

谢谢,我对Django很陌生,但是使用save方法似乎是一个很好的解决方案。这样,我还可以从前端更新值,并强制执行此行为。我会等待一点,以标记为回答,以防有人想出一个解决方案,为管理员设置。