Everything you wanted to know
about the Django framework

Проектирование моделей в Django

В этой статье хотелось бы поделиться опытом и помочь в проектировании и оформлении вашего кода на Django. Надеюсь, что вы уже используете PEP8, но также является хорошим тоном использовать рекомендации по стилям форматирования кода от Django.

Ниже можно ознакомиться с рекомендациями по оформлению кода на Django.

Названия моделей

Так как модель — это класс, то всегда используем соглашение CapWords, т. е. каждое слово в имени модели начинаем с заглавной буквы, без подчеркиваний. Например User, Permission, ContentType и т. д.

Для атрибутов моделей используем snake_case, т.е. все слова с маленькой буквы с разделением подчеркиванием. Например first_name, last_name.

Пример:

from django.db import models

class Company(models.Model):
    name = models.CharField(max_length=30)
    vat_identification_number = models.CharField(max_length=20)

Также для имени модели всегда используйте единственное число: Company вместо Companies. Определение модели — это представление единственного объекта (в данном примере компания), а не множества.

С непривычки это вызывает некоторое недоразумение, если вы привыкли мыслить в понятиях таблиц базы данных. В конечном итоге модель будет переведена в таблицу. Для названия таблицы вполне правильно использовать множественное число, так как таблица представляет собой совокупность объектов.

Последовательность размещения внутри класса модели

Рекомендации Django по последовательности размещения внутренних классов, методов и атрибутов следующие:

  • если для поля модели определены варианты (choices), определите каждый вариант выбора как кортеж кортежей, используя заглавные буквы;
  • поля данных модели;
  • атрибуты пользовательского менеджера;
  • class Meta;
  • def __str__();
  • def save();
  • def get_absolute_url();
  • остальные методы вашего класса.

Пример:

from django.db import models
from django.urls import reverse

class Company(models.Model):
    # CHOICES
    PUBLIC_LIMITED_COMPANY = 'PLC'
    PRIVATE_COMPANY_LIMITED = 'LTD'
    LIMITED_LIABILITY_PARTNERSHIP = 'LLP'
    COMPANY_TYPE_CHOICES = (
        (PUBLIC_LIMITED_COMPANY, 'Public limited company'),
        (PRIVATE_COMPANY_LIMITED, 'Private company limited by shares'),
        (LIMITED_LIABILITY_PARTNERSHIP, 'Limited liability partnership'),
    )

    # DATABASE FIELDS
    name = models.CharField('name', max_length=30)
    vat_identification_number = models.CharField('VAT', max_length=20)
    company_type = models.CharField('type', max_length=3, choices=COMPANY_TYPE_CHOICES)

    # MANAGERS
    objects = models.Manager()
    limited_companies = LimitedCompanyManager()

    # META CLASS
    class Meta:
        verbose_name = 'company'
        verbose_name_plural = 'companies'

    # TO STRING METHOD
    def __str__(self):
        return self.name

    # SAVE METHOD
    def save(self, *args, **kwargs):
        do_something()
        super().save(*args, **kwargs)  # Call the "real" save() method.
        do_something_else()

    # ABSOLUTE URL METHOD
    def get_absolute_url(self):
        return reverse('company_details', kwargs={'pk': self.id})

    # OTHER METHODS
    def process_invoices(self):
        do_something()

Обратные отношения

related_name

Это атрибут используется в поле ForeignKey. Он позволяет указать нормальное и удобное имя для обратного отношения (reverse relationship).

Например:

class Company:
    name = models.CharField(max_length=30)

class Employee:
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name='employees')

Этот код означает, что у объекта модели Company появится атрибут employees, который возвращает QuerySet со всеми объектами работников указанной компании.

google = Company.objects.get(name='Google')
google.employees.all()

Пустые и нулевые поля

Разница между пустыми и нулевыми полями уже обсуждалась, но повторю:

  • null: связан с базой данных, определяет, будет ли данный столбец базы данных принимать нулевые значения или нет.
  • blank: связан с валидацией Django, используется во время проверки формы при вызове form.is_valid ().

Не используйте значение null=True для текстовых полей, которые являются необязательными. В противном случае вы получите два возможных значения для «нет данных»: «Нет» и пустая строка. Наличие двух возможных значений для «нет данных» является избыточным. Соглашение Django должно использовать пустую строку, а не NULL.

# The default values of `null` and `blank` are `False`.
# значение по умолчанию для null и blank - False
class Person(models.Model):
    name = models.CharField(max_length=255)  # обязательное
    bio = models.TextField(max_length=500, blank=True) # необязательное (не используйте null=True для текстовых полей)
    birth_date = models.DateField(null=True, blank=True) # необязательное (здесь нужно использовать оба атрибута null и blank)

Заключение

Определение модели — важная часть вашего приложения. Детальное рассмотрение рекомендаций вы можете посмотреть в документации Django’s Coding Style.

Поделитесь с другими:

Представления-классы
(Class-Based Views)

Детальное описание и структура классов Django.

Выпуск Django 3.0

Команда Django рада объявить о выпуске Django 3.0: движение к тому, чтобы сделать Django полностью асинхронным, предоставляя поддержку для работы в качестве приложения ASGI, теперь официально поддерживает MariaDB 10.1 и выше, а также много других новых функций и возможностей.

Выпущены релизы безопасности Django: 2.2.8 и 2.1.15

В соответствии с политикой безопасности, команда Django выпускает Django 2.2.8 и Django 2.1.15. Этот выпуск решает проблему безопасности, подробно описанную ниже. Мы призываем всех пользователей Django обновиться как можно скорее.

Путь от request до response в Джанго

Веб-приложение или веб-сайт вращаются вокруг цикла запрос-ответ, и приложения Django не являются исключением. Но это не просто двухэтапный процесс. Наши приложения Django должны пройти различные стадии, чтобы вернуть конечному пользователю результат. Чтобы лучше понять структуру Django, мы должны понимать, как инициируются запросы и как конечный результат передается конечному пользователю. В статье объясняются различные этапы запросов и используемое там программное обеспечение или код.

Выпущен релиз-кандидат Django 3.0

Кандидат 1 релиза Django 3.0 - это последняя возможность для вас испытать множество новых функций перед выпуском Django 3.0.

Django DetailView - основы использования

Django позволяет создавать приложения очень легко. Если приложение должно быть выпущено быстро и является относительно общим, то эта среда Python идеально подходит для этого. В течение нескольких лет я профессионально работал в этой среде и часто рылся внутри, поэтому знаю почти всё, и сегодня я представлю вам все, что нужно знать, чтобы эффективно использовать универсальный DetailView в Django.

Выпущены исправления Django: 2.2.7, 2.1.14 и 1.11.26

Сегодня команда разработчиков Django выпустила версии 2.2.7, 2.1.14 и 1.11.26 с исправлениями ошибок. Пакет и контрольные суммы доступны на странице загрузок, а также из индекса пакетов Python. Идентификатор ключа PGP, использованный в этом выпуске: Mariusz Felisiak: 2EF56372BA48CD1B.

Как заставить request.is_ajax() работать с JS fetch()

Объект запроса Django request имеет изящный небольшой метод is_ajax(). Он позволяет определить, поступил ли запрос от JS-фреймворка (он же ajax старой школы). Хотя он отлично работает с некоторыми библиотеками JS, включая почтенный jQuery, он не будет работать с современным встроенным в JS fetch().

Практика программирования на Python 3, лекция №5

Лекции о Python 3 от Тимофея Хирьянова при поддержке Московского физико-технического института. Лекция №5.

Практика программирования на Python 3, лекция №4

Лекции о Python 3 от Тимофея Хирьянова при поддержке Московского физико-технического института. Лекция №4.

Практика программирования на Python 3, лекция №3

Лекции о Python 3 от Тимофея Хирьянова при поддержке Московского физико-технического института. Лекция №3.