Найти тему

Знакомство с работой с БД в Django

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

Создаем шаблон в папке с шаблонами, например groups-list.html, наследуем через {% extends ‘путь к базовому шаблону’ %}.Создаем блоки title и body.

Создаем wiew функцию, например def groups_list(request).

В файле приложения urls.py добавляем нашу wiew функцию.

Для того что бы на странице отобразить список групп – эти группы необходимо достать из базы данных. Для этого необходимо написать код. Переходим в нашу wiew функцию def groups_list(request) и в context создать переменную “groups”,которая будет ссылаться на модель Group(from django.contrib.auth.models import Group).

context = {

“groups”: Group.objects.all(),

}

all() -позволяет вытащить все группы.

“groups” – список групп, которые можно вывести в шаблоне.

У группы(Group) есть свойство permission(многие ко многим) и эта связь с объектами Permission.

permission– свойство из доступов.

Для отображения на странице информации о группе, в шаблоне через цикл можно указать, например:

for group in groups

group.name – имя группы.

group.permissions.all– будут отображены permission для каждой группы в виде QuerySet. Список.

Если обратиться к базе данных, таблица auth_permission, есть колонки codename, name.

Можно вывести в списке:

for permission in group.permissions.all

permission.name – имя permission

permission.codename – код permission

!!! Важно уточнить, что когда делать запрос к permissions.all, то для каждой групп происходит отдельный запрос. Поэтому при большом количества групп – страница будет грузиться долго. Для сокращения запросов к БД необходимо можно отредактировать в wiew функции, как получаются группы.

К “groups”: Group.objects.all()нужно добавить подгрузку связанных permissions.

Для этого: “groups”: Group.objects.prefetch_related(“permissions”).all()

context = {

“groups”: Group.objects.prefetch_related(“permissions”).all(),

}

prefetch_related(“permissions”) - подгрузку связанных permissions. В скобочках указывается свойство, которое необходимо подгрузить. И это свойство по имени, должно полностью совпадать с тем, какой атрибут по имени в модели Group.