Рубрики
Без рубрики

48% проектов Django могут упростить модели .py в этих 3 способах

Код проверки доктора Django и автоматические фиксирует антиблокировки Django. Мы проверили 666 проектов Django для Pro … Tagged Django, Python, WebDev, Codequality.

Мы проверили 666 проектов Django (8 частей серии)

Код проверки доктора Django и автоматические фиксирует антиблокировки Django. Мы проверили 666 проектов Django для проблем, препятствующие ремонтопригодности и обнаружили, что 48% проектов Django могут упростить их модели .py

  • 22% используется Шарфилд с огромным max_length Когда Текстовое поле будет лучше Подробнее
  • 7% использовали устаревшие Nullbooleanfield Подробнее
  • 40% имели строковые поля, которые позволили нулевой Но не пустой или наоборот Подробнее

Были некоторые перекрестки – поэтому некоторые проекты упали в более чем один лагерь. Примечание. Для нулевой и пустой Отлично, и мы проходим через это в глубине позже.

Как бы вы просто моделировали? Пытаться Наши Django Models.py Refactor Challenge .

1. Шарфилд с огромной Max_Length

Когда пользователь должен ввести строку, которая может быть очень давно, то это быстро и легко в использовании Шарфилд (max_length = 5001) , но у этого есть некоторые проблемы:

  • 5001 большой, но достаточно ли достаточно? Что если пользователь хочет больше? да max_length Может быть увеличен, но исправления ошибок – это боль, так как миграция базы данных для облегчения изменений.
  • Годы с данный момент разработчика пылит ваш код и читает номер 5001. Вывод ли они, что есть что-то особенное около 5001? Может быть. Devs В будущем будет очень занят сложными будущими вещами, поэтому давайте не будем добавлять двусмысленность при сохранении вашего «старого» кода.

Текстовое поле Здесь лучше, так как на самом деле нет необходимости в проверке длины, поэтому пользователи не будут представлены ошибкой проверки. Хорошее правило тростника быть Если поле не нуждается в минимальной длине, то, вероятно, не нуждается в максимальной проверке длины . По этой причине, когда я вижу, что это происходит, я предлагаю использовать Текстовое поле :

Так зачем использовать Шарфилд Если Текстовое поле так здорово? Исторически эффективное использование пространства базы данных было ключевым рассмотрением. Но сейчас хранение практически свободно. Плюс, для Postgres По крайней мере, используя Текстовое поле имеет такую же производительность, что и Шарфилд , Таким образом, производительность хранения базы данных не является ключевым рассмотрением.

Есть действующие случаи для Шарфилд С огромной длиной, хотя: просто как ISBN Всегда 10 или 13 символов, есть несколько очень длинных кодов. Хранение QR-коды ? Шарфилд Отказ Работа с геометрией и геопространством? Шарфилд Отказ Джанго ГИС имеет 2048 долл. Varchar что Джанго представляет как Шарфилд (max_length = 2048) .

2. Устаревший нульбуолнфилд

За четыре года документация для Nullbooleanfield было два предложения и один из которых “Да … Не используйте это ». По состоянию на 3,1 упавшего топора, и намека на будущее амортизацию было заменено на фактическое предупреждение о снижении. Вместо использования NullBooleanfield () использовать Booleanfield (Null = True) Отказ

По этой причине, когда я вижу Nullbooleanfield. Я предлагаю использовать Booleanfield (Null = True) :

На грани этого существование Nullbooleanfield кажется странным. Почему целый класс, который может быть достигнут с помощью null Ключевой ключевой арт? Мы не видим Nullcharfield. или Nulldatefield. . Действительно, для тех Джанго ожидает, что нас делают Шарфилд (NULL = TRUE) и Дата Дата (NULL = TRUE) . Так что было так особенным в отношении Nullbooleanfield. И почему это сейчас устарело?

Введите Nullbooleanfield.

Nullbooleanfield делает Nullbooleanselect виджет, который является Содержащие параметры «Неизвестно» (Нет), «Да» (True) и «Нет» (False). Подразделение это Nullbooleanfield. предназначен для того, чтобы явно заявил, что ответ пока не известен. Действительно, во многих контекстах было бы полезно уточнить: «Это ложь, потому что пользователь установил его ложь, или потому что пользователь еще не ответил?». Для облегчения того, что столбец базы данных должен разрешить Null ( Нет на уровне Python).

К сожалению, время показало много места для путаницы: Stackoverflow имеет много вопросов, которые отвечают на «Использование NullBooleanfield вместо Booleanfield ” наоборот. Если одна из причин отделения Booleanfield и Nullbooleanfield должен был дать ясность, а затем вместо того, чтобы обратное произошло для многих.

Выход Nullbooleanfield.

До Django 2.1 в 2018 году NULL не разрешено в Booleanfield потому что (очевидно) Нет не в Bool ценить. Почему мы ожидаем Нет Для использования в поле, которое говорит, что это для логических ценностей? С другой стороны Нет не ул или Но Шарфилд (NULL = TRUE) был поддержан и Нет не int , но Integerfield (null = true) был также приемлемым.

Так что в обессении Nullbooleanfield. Существует аргумент для согласованности тем, как другие поля обрабатывают нуль. Если мы стремимся к последовательности, выбор – это либо добавить Nullcharfield. , Nullintegerfield. , Nulldatefield и так далее или переименовать Nullbooleanfield. к Booleanfield и назовите это в день, хотя Nullbooleanfield было более точным именем.

С этой амортизацией воздействует три класса:

  • django.models.fields. Nullbooleanfield.
  • django.forms.fields. Booleanfield.
  • django.forms.widgets. Nullbooleanselect.

Эти трое имеют немного иное обращение с «пустыми» значениями, поэтому для некоторых своп от Nullbooleanfield к Booleanfield понадобится тщательное тестирование:

from django.forms.fields import NullBooleanField

field = NullBooleanField()

assert field.clean("True") is True
assert field.clean("") is None
assert field.clean(False) is False

from django.forms.fields import BooleanField

field = BooleanField(required=False)

assert field.clean(True) is True
assert field.clean("") is False
assert field.clean(False) is False

from django.db.models import fields

field = fields.BooleanField(null=True, blank=True)

assert field.clean(True, "test") is True
assert field.clean("", "test") is None
assert field.clean(False, "test") is False

3. Нуль и пустые из синхронизации

Ожидайте неожиданного, если нулевой и пустой разные значения: null УПРАВЛЕНИЕ Если валидация уровня базы данных не позволяет никакого значения для поля, в то время как пустые элементы управления, если валидация уровня приложения не позволяет никакого значения для поля.

Если пустой = Правда Затем проверка модели поля позволяет пустое значение, такое как "" быть введенным пользователями. Если blank = false. Затем валидация предотвратит введенные пустые значения.

С другой стороны, null Сообщает базу данных, если столбец базы данных для поля может быть оставлен пустым, что приведет к настройке базы данных Null или Не нулевой на столбце. Если база данных сталкивается с пустым Не нулевой столбец тогда он поднимет IntergeityError Отказ

пустой используется во время прокортирования поля. Форма , Моделка , а также Modelerializer Каждый триггерный уровень полевой проверки. Для конкретного примера Моделка Вызывает экземпляр модели full_clean Метод во время проверки формы, а также Full_clean, затем звонки Clean_fields , что, в свою очередь, может поднять ValidationError Отказ

По этой причине, когда я вижу это, я предлагаю следующее:

Так что обычно мы хотим нулевой и пустой к тому же величине? Когда мы хотим иметь null = Ложь и пустой = Правда или даже null = Правда и пустой = Ложь ?

,

Это облегчает использование разумных значений по умолчанию для полей строки: поле может иметь значение по умолчанию, такое как Имя (null = false ,,) Отказ Это полезно, если поле является необязательным, но мы также хотим предотвратить отсутствие столбца базы данных, имеющих непоследовательные типы данных. Иногда нет, иногда быть "" И в другие времена не пустые строки вызывают дополнительную сложность в коде и в ORM: если мы хотели найти всех пользователей без имени:

Foo.objects.filter(name="") | Foo.objects.filter(name__isnull=True)

Сравните это с помощью случая, когда значение в столбце базы данных всегда будет строка:

Foo.objects.filter(name="")

,

Этот сценарий больше, чтобы сохранить базу данных счастливой. При использовании django.db.bageends.Oracle Двигатель базы данных, тогда это может потребоваться, потому что Oracle заставляет пустые строки к Null даже если пустая строка была представлена в форме, так что Имя (null = true,) будет необходим.

Нулевые стратегии развертывания простоя могут потребоваться Null В столбце базы данных, даже если бизнес-требования диктуют, пользователь должен ввести значение в форме. Во время синего/зеленых развертываний как новая кодовая база, так и старая кодовая база выполняется против одной и той же базы данных. Если новая кодовая база добавляет новые поля, и для этого нет разумного значения по умолчанию, тогда null = Правда Необходимо избежать, выбрасывая базу данных IntergeityError Хотя экземпляр вашего сайта, выполняющий старую кодовую базу, взаимодействует с базой данных.

Пока столбец базы данных может принять null Валидация формы может запретить конечным пользователям не вводить значения, поэтому согласованность типа данных гарантирована? Нет – это требует проверка формы для фактического запуска. Если разработчик создает или обновляет через оболочку, то валидация не будет запускать, если разработчик не звонит instance.full_clean () или induction.clean_fields () Отказ Эта стратегия упрощается, если вместо настройки можно использовать значение Sane по умолчанию. null = Правда .

Можете ли упростить ваши модели?

Я могу проверить это для вас в django.doctor или может Просмотрите свой GitHUB PRS :

Или попробуйте Рефакторы Django Challenges Отказ

Мы проверили 666 проектов Django (8 частей серии)

Оригинал: “https://dev.to/djangodoctor/48-of-django-projects-could-simplify-models-py-in-these-3-ways-1anc”