Выбор лимитов для Чарфилда
У меня есть модель для всех вариантов выбора в программе. Вместо кортежа Choices я хочу использовать эту таблицу для отображения вариантов и проверки из таблицы при сохранении. Таким образом, она не будет статичной, как кортеж choices в модели.
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 key и опцию limit_choices_to. В программе также есть много полей выбора, поэтому переопределение метода сохранения не является лучшей практикой в этой ситуации.
Есть ли возможность сохранить его как поле символов и валидировать из другой таблицы? Пользовательское поле модели или что-то еще?
Вы не можете использовать
x = models.CharField( choices=someething_dynamic, ...)
потому что в этом контексте выбор является ограничением базы данных (хранится в БД и может быть изменен только путем создания и применения миграции)
Вы можете использовать динамический выбор в форме, которая вводит данные для хранения в этом поле. Например, ответ . Подразумевается, что возможно, чтобы данные, которые не являются допустимым выбором, попали в базу данных, например, путем создания и сохранения объекта с недопустимыми данными, а не получения данных через форму... но тогда они в любом случае могут стать недопустимыми позднее, когда критерии динамического выбора изменятся.
Вы можете пойти дальше и применить динамическую проверку выбора в процессе сохранения модели, указав пользовательский validator для рассматриваемого поля.
x = models.CharField( validators=[x_validator,], ...)
Помните, что если вы сделаете это и критерии, проверяемые x_validator, будут динамически меняться, вам, возможно, придется обрабатывать ValidationError возникающие при обновлении объекта, который был сохранен со значением, которое было действительным при его создании, но которое больше не действительно!