Я пишу поле пользовательской модели с именем EnumField
для базы данных mysql, которое выглядит ниже
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
должен быть list
или tuple
., А атрибут values должен содержать уникальный ключ и значения.
например, если кто-то пытается использовать EnumField
, как показано ниже, с duplicate values
или isinstance(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