限制Charfield的选择



我有一个程序中所有选项的模型。我想用这个表来显示选项,并在保存时从表中验证,而不是Choices Tuple。所以它不会像模型中的元组选择那样是静态的。

class FIELD_CHOICES(models.Model):
groupName = models.CharField(max_length=120, null=True, blank=True)
value = models.CharField(max_length=120, null=True, blank=True)
key = models.CharField(max_length=120, null=True, blank=True)
active = models.BooleanField(default=True, blank=True)

主要的问题是,我现在正在使用charfield进行选择,由于其他原因,它应该保持为charfield。所以我不能使用Foreing键模型类型和limit_choices_to选项。程序中还有很多选项字段,所以在这种情况下,重写保存方法不是最佳实践。

是否有任何选项可以将其保留为charfield并从另一个表进行验证?自定义模型字段还是其他什么?

您不能使用

x = models.CharField( choices=someething_dynamic, ...)

因为在这种情况下,选择是一个数据库约束(存储在数据库中,只能通过创建和应用迁移来更改(

您可以在输入要存储在该字段中的数据的表单中使用动态选择。例如,这个答案。这意味着,对于不是有效选择的数据,进入数据库是可能的,例如,通过创建和保存具有无效数据的对象,而不是通过表单获取数据。。。但是,在任何情况下,当动态选择标准发生变化时,都可能在以后变得无效。

您可以更进一步,通过为有问题的字段指定一个自定义验证器,在模型保存过程中应用动态选择检查。

x = models.CharField( validators=[x_validator,], ...)

请注意,如果您这样做,并且x_validator检查的条件动态更改,则您可能必须处理在更新对象时出现的ValidationError,该对象使用创建时有效但不再有效的值保存!

最新更新