在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()
此数据使用admin进行管理。我想要的是,当系统的一个示例被标记为is_production时,该系统的所有其他示例都将其is_production字段更新为False。
此外,我感兴趣的是如何最好地设置管理员为这种情况。我将使用内联来编辑/创建示例。
但是,我不确定如何确保每个系统在生产中只能有一个示例。
- 我是否应该使用系统上的下拉列表来选择生产示例并使用
formfield_for_foreignkey
进行过滤? - 使用管理操作,类似于:
Mark as production
? - 保存后使用信号?
- 还有什么我没想过的方法吗
2条答案
按热度按时间fnatzsnv1#
你问了很多问题,但我会集中在我解释为主要的一个:
我想要的是,当系统的一个示例被标记为is_production时,该系统的所有其他示例都将其is_production字段更新为False。
重写Instance模型的保存方法怎么样?
这确保了只要保存了is_production=True的Instance示例,链接到相关System对象的所有其他Instance示例的is_production值都将更新为False。
根据您更改Instance示例的is_production值的方式,这可能适合也可能不适合您想要执行的操作。例如,这个线程讨论了如何使用.update()方法不会导致保存()方法被调用:Django .update doesn't call override save?(也在Django文档中描述,在链接线程中引用)
uemypmqf2#
在Django Admin中,你只能用保存_formset()在一对多关系中创建一个内联(子)对象boolean字段
True
。例如,有
Person
模型和Email
模型,其外键为Person
模型,如下所示:并且,
Person
admin具有Email
内联,如下所示:现在,我重写
save_formset()
,如下所示。* 只有第一次提交的内联对象is_used=True
被接受为is_used=True
:然后,添加主(父)对象和3个内联(子)对象,第二个和第三个内联对象是
is_used=True
,如下所示:然后,只有第二个内联对象是
is_used=True
,如下所示:接下来,将第三个内联对象的
is_used=False
更改为is_used=True
,如下所示:然后,只有第三个内联对象是
is_used=True
,如下所示。* 对于内联,只有更改的对象被传递到save_formset()
,然后在其中处理:此外,下面的代码可以做更多的事情:
例如,add页面默认只有第一个inline对象是
is_used=True
,如下图所示:并且,如果尝试添加或更改所有
is_used=False
的内联对象,如下所示:然后,第一个内联对象是
is_used=True
,如下所示:并且,如果尝试添加或更改多个
is_used=True
内联对象,如下所示:然后,只有第一个内联对象
is_used=True
被接受为is_used=True
,如下所示:并且,如果尝试删除内联对象
is_used=True
,如下所示:然后,第一个内联对象是
is_used=True
,如下所示:并且,如果尝试删除所有内联对象,包括
is_used=True
对象,如下所示:然后,第一个内联对象是未删除的
is_used=True
,如下所示。* 必须至少有一个内联对象: