Django Admin-一对多-如何确保只有一个子项选择了布尔字段
在django,我有以下模型: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 ?
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
- 使用管理操作,例如:
标记为生产
- 保存后使用信号
- 还有什么我没有想到的方法吗
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方法似乎是一个很好的解决方案。这样,我还可以从前端更新值,并强制执行此行为。我会等待一点,以标记为回答,以防有人想出一个解决方案,为管理员设置。