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

Лучшие практики Django: модели

Правильно определяющие модели базы данных, возможно, самая важная часть нового проекта, однако Djang … Теги с Джанго, Питоном, Учебником, начинающими.

Правильно определяющие модели базы данных, возможно, Самая важная часть нового проекта, однако Django предоставляет нам огромную гибкость вокруг Как Мы структурируем наши модели.

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

  • выбор
  • поля базы данных
  • пользовательские атрибуты менеджера
  • Мета
  • def __str __ ()
  • Def Сохранить ()
  • def get_absolute_url ()
  • Пользовательские методы

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

Шаг 1 – Модель и поля поля

Самая простая возможная модель имеет только 4 строки кода. Это импортирует модели определяет модель модели Университет и имеет одно поле full_name Отказ

# schools/models.py
from django.db import models

class University(models.Model):
    full_name = models.CharField(max_length=100)

Модели всегда должны быть Капитализированные (например. Университет , Пользователь , Статья ) и единственное число (например,. Университет не Университеты ) Поскольку они представляют собой один объект, не несколько объектов.

Поля должны быть все строчные Используя подчеркивания, а не камерки, так full_name не FullName Отказ

Шаг 2 – Общие методы

После определения модели и полей следующий шаг часто добавляет __str __ () и get_absolute_url методы.

ул …| Метод определяет читаемое человеком представление модели, которая отображается на сайте администратора Django и в оболочке Django.

get_absolute_url () Метод устанавливает канонический URL для модели. Это требуется при использовании Обратный () функция. Это также правильный способ ссылки на модель в ваших шаблонах, а не в жестком кодировании.

И администратор Django добавит услугу «Просмотр на сайте» ссылку на ваши модели.

# schools/models.py
from django.db import models
from django.urls import reverse # new

class University(models.Model):
    full_name = models.CharField(max_length=100)

    def __str__(self): # new
        return self.full_name

    def get_absolute_url(self): # new
        return reverse('university_detail', args=[str(self.id)])

Примечание : Этот пример предполагает Университет_detail Именованный URL ссылается на подробный вид.

Третий общий метод – Сохранить () Метод, который позволяет нам настроить, как сохраняется модель. Обычный пример предназначен для приложения блога, который необходимо автоматически устанавливать Автор поста в блоге до текущего вошекладированного пользователя. Вы будете реализовать эту функциональность с Сохранить () Отказ

Шаг 3 – Явное название

Django делает ряд неявный Варианты именования, которые часто путешествуют начинающим. С явное лучше, чем неявное , это хорошая идея, чтобы установить эти значения вручную.

Django ImpliciTly устанавливает читаемое имя человека для каждого поля, преобразуя подчеркивание в пробелы. Итак, full_name представлен как Полное имя Отказ Есть два способа установить это вручную: вы можете использовать verbose_name () или до тех пор, пока тип поля не Иностранник , Manytomanyfield или OneToonefield , вы можете установить его как дополнительный первый позиционный аргумент.

Таким образом, следующие три строки кода идентичны, что касается Django:

# All 3 are equivalent!
full_name = models.CharField(max_length=100)
full_name = models.CharField('full name', max_length=100)
full_name = models.CharField(verbose_name='full name', max_length=100)
# schools/models.py
from django.db import models


class University(models.Model):
    full_name = models.CharField(
        max_length=100,
        verbose_name='university full name', # new
    )

    def __str__(self):
        return self.full_name

    def get_absolute_url(self):
        return reverse('university_detail', args=[str(self.id)])

Когда Иностранник Отношения существуют, Django снова неявно определяет еще два имена, которые нам часто нуждаются. Давайте добавим Студент Модель, чтобы проиллюстрировать это.

# schools/models.py
...
class Student(models.Model): # new
    first_name = models.CharField('first name', max_length=30)
    last_name = models.CharField('last name', max_length=30)
    university = models.ForeignKey(
        University,
        on_delete=models.CASCADE,
        related_name='students',
        related_query_name='person',
    )

    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)

    def get_absolute_url(self):
        return reverse('student_detail', args=[str(self.id)])

Работа с Иностранный ключ означает после отношения “назад” Отказ По умолчанию Django устанавливает это в нашем примере для Студент_set и любые имена фильтров для Student__First_Name Отказ

dartmouth = University.objects.get(full_name='Dartmouth')
dartmouth.student_set.all() # returns all students at Dartmouth
dartmouth.objects.filter(student__first_name='william') # returns all Dartmouth students named William

Обратите внимание на одно подчеркивание _ VS Два подчеркивания __ в этом. Это легкая ошибка, чтобы сделать!

Лучший подход – явно установить эти значения. rottle_name () должно быть множественное число модели, содержащей Иностранник ( студенты для студент модель) и rottle_query_name () должно быть единственный Отказ

yale = University.objects.get(full_name='Yale')
yale.students.all() # returns all students at Yale
yale.objects.filter(person__first_name='ashley') # returns all Yale students named Ashley

Шаг 4 – Мета класс

Мета класс невероятно мощный и имеет Долгий список функций Отказ

Хороший первый шаг – явно назвать свою модель, а не только ваши поля. Это можно сделать с verbose_name. и verbose_name_plural Отказ В противном случае Django просто добавит S Чтобы сделать это множеством, Университет , что не так.

class Meta:
    verbose_name = 'university'
    verbose_name_plural = 'universities'

Еще одна общая особенность – заказ которые устанавливают порядок по умолчанию списка объектов. Если бы мы хотели иметь веб-страницу, где мы перечислили все университеты в алфавитном порядке, вот как мы его установили.

Будьте в курсе, хотя это может быть Производительность удара для заказа результатов Итак, Не заказывайте результаты, если вам не нужно.

Однако, если вам нужно заказанные результаты, рассмотрите возможность добавления индекса для ускорения. Индекс Обычно Является хорошей идеей, но поддерживая его также требует какого-то накладных расходов, поэтому вы захотите проверить, какая реализация является более исполнительным.

Чтобы добавить индекс, который мы можем добавить db_index = Правда на поле или установить его через индексы В нашем Мета класс. Мы реализуем последние.

# schools/models.py
from django.db import models
from django.urls import reverse

class University(models.Model):
    full_name = models.CharField(
        max_length=100,
        verbose_name='university full name',
    )

    class Meta: # new
        indexes = [models.Index(fields=['full_name'])]
        ordering = ['-full_name']
        verbose_name = 'university'
        verbose_name_plural = 'universities'

    def __str__(self):
        return self.full_name

    def get_absolute_url(self):
        return reverse('university_detail', args=[str(self.id)])


class Student(models.Model):
    first_name = models.CharField('first name', max_length=30)
    last_name = models.CharField('last name', max_length=30)
    university = models.ForeignKey(
        University,
        on_delete=models.CASCADE,
        related_name='students',
        related_query_name='person',
    )

    class Meta: # new
        verbose_name = 'student'
        verbose_name_plural = 'students'

    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)

    def get_absolute_url(self):
        return reverse('student_detail', args=[str(self.id)])

Шаг 5 – Выбор

Если выбор определяется для данного поля модели, определите каждый выбор в виде кортеже, с именем все прописных букв в качестве атрибута класса на модели.

Здесь мы добавили поля выбора нашим Университет Модель и новый Университет_тып поле.

# schools/models.py
from django.db import models
from django.urls import reverse

class University(models.Model):
    UNIVERSITY_TYPE = ( # new
        ('PUBLIC', 'A public university'),
        ('PRIVATE', 'A private university')
      )

    full_name = models.CharField(
        verbose_name='university full name',
      max_length=100
    )
    university_type = models.CharField( # new
        choices=UNIVERSITY_TYPE_CHOICES,
        max_length=1,
        verbose_name='type of university',
    )

    class Meta:  
        indexes = [models.Index(fields=['full_name'])]
        ordering = ['-full_name']
        verbose_name = 'university'
        verbose_name_plural = 'universities'

    def __str__(self):
        return self.full_name

    def get_absolute_url(self):
        return reverse('university_detail', args=[str(self.id)])

Если вы хотите обратиться к значению «читаемое человеком» поле выбора, используйте get_foo_display () Отказ

Вот пример добавления, а затем отображение нового университета в оболочке Django.

>>> u = University(full_name='College of William and Mary', university_type='PUBLIC')
>>> u.save()
>>> u.university_type # 'PUBLIC'
>>> u.get_university_type_display() # 'A public university'

Если вы собираетесь провести много времени, используя Shell Django, вам понравится Django-расширения и его Shell_plus команда.

Шаг 6 – Пусть против нулевой

По умолчанию всякий раз, когда вы определяете новую модель базы данных как null и пустой установлены на ложь. Эти два значения легко спутать, но совсем другое.

null это связанная с базой данных Отказ Когда поле имеет null = Истинный Он может хранить запись базы данных как Null , что означает отсутствие значения.

пустой это Связанные к валидации , если пустой = Истинный Тогда форма позволит пустое значение, тогда как если пустой = Ложь Тогда требуется значение.

Сложная часть – это то, что Тип поля диктует, как использовать эти значения. Не используйте null со строчными полями, такими как Шарфилд или Текстовое поле Поскольку это приводит к двум возможным значениям для «Нет данных». Конвенция Django вместо этого используется пустая строка '' , не Null Отказ

Исключение в том, что если Шарфилд Имеет оба уникальный = правда и пустой = Истинный тогда null = Правда Также необходимо избегать уникального нарушения ограничений при сохранении нескольких объектов с пустыми значениями.

Дальнейшее обучение

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

Книга Две совки Джанго имеет очень полный раздел по дизайну модели, включая простое в использовании руководство по лучшим практикам с пустой и нулевой . Это рекомендуемый ресурс для всех разработчиков Django.

Сайт Просто лучше сложного Это сокровищница хороших советов по Джангу, включая модель дизайна.

Haki Benita имеет прекрасную статью на Pullet Vectoring Django Models и Сталь Киви Также имеет хороший список.

Примечание : Особая благодарность Джефф Триплетт и Патрик Квалик Для отзывов и предложений.

Оригинал: “https://dev.to/learndjango/django-best-practices-models-5hm1”