Зачем мне устанавливать max_length при использовании Choices в модели Django? - PullRequest
0 голосов
/ 25 мая 2018

В официальном уроке Django 2 я нашел это:

from django.db import models

class Student(models.Model):
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'
    YEAR_IN_SCHOOL_CHOICES = (
        (FRESHMAN, 'Freshman'),
        (SOPHOMORE, 'Sophomore'),
        (JUNIOR, 'Junior'),
        (SENIOR, 'Senior'),
    )
    year_in_school = models.CharField(
        max_length=2,
        choices=YEAR_IN_SCHOOL_CHOICES,
        default=FRESHMAN,
    )

Теперь мой вопрос: означает ли использование выбора, что только одно из четырех определенных значений является допустимым для этого поля?Если да, какая польза от указания max_length?Если нет, то почему бы не использовать валидатор, который проверяет, является ли значение фактически одним из указанных или, по крайней мере, валидатором, который принимает только определенную длину, а не только верхнюю границу.

1 Ответ

0 голосов
/ 25 мая 2018

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).

...