Прием с использованием менеджера модели
Сначала создадим файл 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())