Django Model Extra Fields. Произвольное количество полей для модели или что то другое
Есть такое ТЗ. Есть 2 модели: DataScheme, DataSchemeColumn Каждый DataScheme может содержать произвольное количесто колонок(DataSchemeColumn). DataSchemeColumn состоит из name и data type.
Нужно заимплеменить такие Data Types:
- Full name (a combination of first name and last name)
- Job
- Domain name
- Phone number
- Company name
- Text (with specified range for a number of sentences)
- Integer (with specified range)
И САМОЕ ВАЖНОЕ И НЕПОНЯТНОЕ. Некоторые data type могут поддерживать extra arguments(extra fields скорее), типо range для Integer. Каким образом изобразить data types и как их подружить с DataSchemeColumn ?
Ответы (1 шт):
Самый простой способ "в лоб" это хранить для нужных DataType-ов коллекцию параметров, для Integer, скажем, их будет два min_value и max_value.
Ну и ассоциацию между DataSchemeColumn и DataType, что-то вроде:
class DataType(models.Model):
TYPES = (
('EMAIL', 'Email'),
# и т.д.
)
name = models.CharField()
type = models.CharField(max_length=10, choices=TYPES)
class DataTypeParameter(models.Model):
name = models.CharField()
data_type = models.ForeignKey(
DataType, on_delete=models.CASCADE, related_name="parameters")
value = models.CharField() # сериализированное значение параметра
class DataSchemeColumn(models.Model):
name = models.CharField()
data_type = models.ForeignKey(DataType, on_delete=models.CASCADE)
Неудобство тут, что нужно вручную сериализировать значения параметров, если они могут быть разных типов, ну или использовать другие варианты, как хранить значения разных типов (например, несколько полей разных типов string_value, int_value и т.п.).
Если используется postgres или mysql, то можно эти дополнительные параметры хранить не в отдельной коллекции, а в поле самой модели DataType типа JSONField. Тогда модель DataTypeParameter не нужна.