Выбор лимитов для Чарфилда

У меня есть модель для всех вариантов выбора в программе. Вместо кортежа 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 возникающие при обновлении объекта, который был сохранен со значением, которое было действительным при его создании, но которое больше не действительно!

Вернуться на верх