【问题标题】:How to validate django custom model field attributes?如何验证 django 自定义模型字段属性?
【发布时间】:2019-09-06 03:51:24
【问题描述】:

我正在为 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 valuesisinstance(values) 不是tuple or list,我需要抛出异常。我该如何实现。

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

【问题讨论】:

    标签: python mysql django django-models


    【解决方案1】:

    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")
    

    【讨论】:

    • 我只是想确保values 应该是唯一的,而不是在数据库级别。并且允许的值应该是 listtuple only
    • 我不确定这是否可行
    • 当我们使用 CharField 时会抛出 max_length 异常
    猜你喜欢
    • 2022-01-24
    • 2016-02-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    相关资源
    最近更新 更多