max_length
применяется на уровне базы данных, но choices
применяется на уровне кода Python (при вызове full_clean()
или clean_<fieldname>()
).
Они не зависят друг от друга.
Если вы задаете для своего поля значение, отличное от указанного, и вы не вызываете instance.full_clean()
или instance.clean_<fieldname>()
, он все еще может быть сохранен в базе данных без ошибок.
Но если вы используете формы djangos, проверка choices
для вас сделана (форма вызывает full_clean()
), и вам не нужнобеспокоиться об этом.
Это означает, например, что если вы установите max_length
меньше, чем ваш самый большой параметр в choices
, ваша база данных будет молча обрезать значения для этого поля или поднять DatabaseError
;в любом случае вы не сможете заставить его работать.
Это разделение полезно, например, если вы хотите добавить больше вариантов позже;если новые параметры не превышают max_length
, вам не нужно будет менять структуру базы данных (это означает, что новая миграция НЕ выдаст alter table
операторов SQL).