我的 Django 应用程序中有两个模型:
class Survey(models.Model):
survey_type = models.CharField(max_length=1, choices=SURVEY_TYPES)
class Response(models.Model):
survey = models.ForeignKey(Survey)
response = models.TextField()
调查组织者创建调查后,他们可以指定类型。一旦出现第一个响应,我不希望组织者能够使用网站管理员更改类型(因为响应模型中的自由文本响应字段会改变含义)。
我已经研究过使用验证器,但据我所知,它们旨在对表单进行操作,而不是对要保存的对象进行操作。我找不到任何对在其中执行数据库查询的支持。
我还考虑过重写 save 方法,但据我所知,它预计不会用于验证(而且我不想在我的模型中放入任何逻辑) .
我在其他框架中这样做的方式是在 ORM 之上引入一些层,允许我引入业务规则。请指教 - 这里的最佳实践是什么?
最佳答案
您实际上可以使用模型级验证:
class Survey(models.Model):
survey_type = models.CharField(max_length=1, choices=SURVEY_TYPES)
def __init__(self, *args, **kwargs):
super().__init__(self, *args, **kwargs)
self._old_survey_type = self.survey_type
def clean(self):
if (self.survey_type != self._old_survey_type) \
and survey_typeself.response_set.exists():
raise ValidationError('Cannot modify the type of a started survey')
但请注意,保存对象时不会自动调用Model.clean
。当 ModelForm
得到验证时(因此也在管理中),它会执行,但否则您必须检查它是否有效或自己调用它。
关于python - 如果存在相关对象,则阻止字段更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33479855/