如何验证Django自定义模型字段属性?

时间:2019-04-16 06:00:50

标签: mysql django django-models python-3.6 django-2.2

我正在为MySQL数据库编写名为EnumField的自定义模型字段,如下所示

class EnumField(models.Field):

    def __init__(self, *args, **kwargs):
       self.values = kwargs['values']
       kwargs['choices'] = [(key, value) for key, value in self.values]
       super().__init__(*args, **kwargs)

    def db_type(self, connection):
       enum_values = ",".join([key for key, value in self.values])
       return f"ENUM({enum_values})"

我希望它能很好地工作,但是我不知道强制实施约束的方法,例如values属性应该是listtuple。而values属性应该包含唯一的键和值。

例如,如果有人试图像下面将EnumFieldduplicate values一起使用isinstance(values)而不是tuple or list,则我需要抛出异常。如何实现该目标。 / p>

class MyModel(models.Model)
    field1 = EnumField(values=(('Y', 'yes'), 'Y', 'Yes')) //Invalid &need to raise exception
    field2 = EnumField(values=(('Y', 'yes'), ('N', 'No'))) // valid
    field3 = EnumField(values="check") //invalid & need to raise exception
    field4 = EnumField(values=[1,2,3]) //Invalid & need to raise exception
    field5 = EnumField(values=[('LIVE', 'Live'), ('OFFLINE', 'Offline')]) //valid

1 个答案:

答案 0 :(得分:0)

Unique is what you want

Here is the link to the docs

如果您不希望在数据库级别发生这种情况,则需要这样的python代码

if isinstance(var, tuple):
    do something
else:
    raise forms.ValidationError("Not a tuple")