Header Image

Менеджер модели в Django

Загружено/обновлено 14 Ноября 2016

Прием с использованием менеджера модели

Сначала создадим файл managers.py в папке приложения импортируем класс Manager и пропишем подобный код, в зависимости от реального содержания моделей в вашем приложении. Я использую пример с исполнителями, песнями и альбомами.

from .models import Artist, Album
from django.db.models.manager import Manager
import datetime

class AlbumManager(Manager):
    def by_year(self, year):
            return self.get_queryset().filter(
                    release_date__gte=datetime.date(year, 1, 1),
                        release_date__lte=datetime.date(year, 12, 31))

class SongManager(Manager):
    def by_year(self, year):
            return self.get_queryset().filter(
                    release_date__gte=datetime.date(year, 1, 1),
                        release_date__lte=datetime.date(year, 12, 31))

    def rolling_7(self):
        today = datetime.date.today()
            week_ago = today - datetime.timedelta(days=7)
            return self.get_queryset.filter(
                album__release_date__gte=week_ago,
                    album__release_date__lte=today)) 

В моделях нужно прописать, что мы используем свой менеджер вместо стандартного: objects=SongManager.

Использовать менеджер нужно так:

Song.objects.by_year(2000)

Добавление записей через менеджер

Менеджеры можно так же использовать для создания или изменения записей. Разовьём предыдущей пример.

class AdvancedSongManager(SongManager):
    def new_song(self, song_title, artist, album, release_date):
            artist = Artist.objects.get_or_create(name=artist)[0]
                album = Album.objects.get_or_create(title=album,artist=artist,release_date=release_date)[0]

                song = self.model(title=song_title, artist=artist, album=album)
                song.save(using=self._db)

                return song

Не забываем добавить в модель новый менеджер: objects=AdvancedSongManager.

Использование

    Song.objects.new_song("New Song", "Some Artist", "Some Album", datetime.date.today())