Django предоставляет мощный ORM (Object-Relational Mapper) для взаимодействия с базами данных и удобные инструменты для отображения данных в HTML-шаблонах. Эта статья охватывает ключевые шаги этого процесса, предназначенная для разработчиков уровня Middle и Senior.
Настройка подключения к базе данных в Django
Конфигурация settings.py: определение параметров базы данных
В файле settings.py определите параметры подключения к вашей базе данных. Основные параметры:
ENGINE: Движок базы данных (например,'django.db.backends.postgresql').NAME: Имя базы данных.USER: Имя пользователя базы данных.PASSWORD: Пароль пользователя базы данных.HOST: Адрес хоста базы данных.PORT: Номер порта базы данных.
Пример:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
Миграции: создание и применение миграций
Django использует миграции для синхронизации структуры базы данных с моделями. После изменения моделей необходимо создать миграции и применить их:
python manage.py makemigrations
python manage.py migrate
Проверка подключения к базе данных
Простейший способ проверить подключение — выполнить любой запрос к базе данных через Django shell:
python manage.py shell
Затем, в shell, можно импортировать модель и попытаться получить данные. Если подключение настроено верно, запрос вернет результат, в противном случае возникнет исключение.
Определение моделей Django для работы с данными
Создание моделей в файле models.py
Модели Django представляют структуру данных. Каждая модель – это класс, наследуемый от django.db.models.Model. Атрибуты класса соответствуют полям таблицы базы данных.
Пример:
from django.db import models
class AdCampaign(models.Model):
name: models.CharField = models.CharField(max_length=200, verbose_name='Название кампании')
start_date: models.DateField = models.DateField(verbose_name='Дата начала')
end_date: models.DateField = models.DateField(verbose_name='Дата окончания')
budget: models.DecimalField = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Бюджет')
target_audience: models.TextField = models.TextField(verbose_name='Целевая аудитория')
def __str__(self) -> str:
"""Возвращает строковое представление объекта."""
return self.name
class Meta:
verbose_name: str = 'Рекламная кампания'
verbose_name_plural: str = 'Рекламные кампании'
Связи между моделями
Django поддерживает различные типы связей:
ForeignKey: Отношение «один ко многим».ManyToManyField: Отношение «многие ко многим».OneToOneField: Отношение «один к одному».
Регистрация моделей в admin.py
Регистрация моделей в admin.py позволяет управлять данными через Django Admin:
from django.contrib import admin
from .models import AdCampaign
@admin.register(AdCampaign)
class AdCampaignAdmin(admin.ModelAdmin):
list_display: tuple[str] = ('name', 'start_date', 'end_date', 'budget')
search_fields: tuple[str] = ('name', 'target_audience')
list_filter: tuple[str] = ('start_date', 'end_date')
Извлечение данных из базы данных
Использование ORM Django: запросы через QuerySet API
ORM Django позволяет выполнять запросы к базе данных с использованием Python кода. Основные методы:
all(): Получение всех объектов.get(): Получение одного объекта по условию.filter(): Фильтрация объектов по условию.
Пример:
from .models import AdCampaign
# Получение всех рекламных кампаний
all_campaigns = AdCampaign.objects.all()
# Получение кампании по имени
campaign = AdCampaign.objects.get(name='Весенняя распродажа')
# Получение кампаний с бюджетом больше 10000
high_budget_campaigns = AdCampaign.objects.filter(budget__gt=10000)
Фильтрация данных
Методы filter() и exclude() используются для фильтрации данных. Q-объекты позволяют строить сложные запросы с использованием логических операторов.
from django.db.models import Q
# Кампании, начавшиеся после 2024-01-01 или с бюджетом больше 5000
filtered_campaigns = AdCampaign.objects.filter(Q(start_date__gt='2024-01-01') | Q(budget__gt=5000))
# Кампании, не закончившиеся до 2024-06-01
excluded_campaigns = AdCampaign.objects.exclude(end_date__lt='2024-06-01')
Сортировка данных
Метод order_by() позволяет сортировать данные по одному или нескольким полям:
# Сортировка по дате начала в порядке убывания
sorted_campaigns = AdCampaign.objects.order_by('-start_date')
Выборка определенных полей
Методы values() и values_list() позволяют выбрать только определенные поля из модели. values() возвращает список словарей, а values_list() — список кортежей.
# Получение названий и бюджетов кампаний
campaign_data = AdCampaign.objects.values('name', 'budget')
# Получение списка названий кампаний
campaign_names = AdCampaign.objects.values_list('name', flat=True)
Передача данных в HTML-шаблон
Создание View
View – это функция или класс, обрабатывающий HTTP-запрос и возвращающий HTTP-ответ. В View происходит получение данных из базы и передача их в шаблон.
from django.shortcuts import render
from .models import AdCampaign
def campaign_list(request):
"""Отображает список рекламных кампаний."""
campaigns: list[AdCampaign] = AdCampaign.objects.all()
context: dict[str, list[AdCampaign]] = {'campaigns': campaigns}
return render(request, 'campaigns/campaign_list.html', context)
Контекст шаблона
Контекст шаблона – это словарь, содержащий данные, которые будут доступны в шаблоне. В примере выше, данные о кампаниях передаются в шаблоне под ключом 'campaigns'.
Использование TemplateView и ListView
TemplateView – это базовый класс для отображения простых шаблонов. ListView – это специализированный класс для отображения списков объектов. ListView автоматически предоставляет контекстную переменную с именем object_list, содержащую список объектов.
Отображение данных в HTML-шаблоне
Создание HTML-шаблона
HTML-шаблон использует Django Template Language (DTL) для отображения данных. DTL предоставляет синтаксис для переменных, циклов, условных операторов и фильтров.
Циклы for
Цикл for используется для отображения списков данных:
<ul>
{% for campaign in campaigns %}
<li>{{ campaign.name }} - {{ campaign.budget }}</li>
{% endfor %}
</ul>
Условные операторы if/else
Условные операторы позволяют отображать данные в зависимости от условий:
{% if campaigns %}
<p>Найдено {{ campaigns|length }} кампаний.</p>
{% else %}
<p>Кампании не найдены.</p>
{% endif %}
Фильтры шаблонов
Фильтры шаблонов используются для форматирования данных. Примеры:
date: Форматирование даты.truncatechars: Обрезание текста до определенной длины.currency: Форматирование чисел как валюты (требует установкиdjango-moneyили аналогичного пакета).
<p>Дата начала: {{ campaign.start_date|date:"d.m.Y" }}</p>
<p>Описание: {{ campaign.target_audience|truncatechars:100 }}</p>
В заключение, Django предоставляет все необходимые инструменты для эффективного извлечения данных из баз данных и отображения их в HTML-шаблонах. Использование ORM, View и DTL позволяет создавать сложные веб-приложения с минимальными усилиями.