[英]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。
另外,我对如何为这种情况最好地设置管理员感兴趣。 我将使用内联来编辑/创建实例。
但是,我不确定如何确保每个系统在生产中只能有一个实例。
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.