python / intermediate
Snippet
Django Benutzerdefinierter Model Manager mit Verkettungsmethoden
Benutzerdefinierte Manager ermöglichen es Ihnen, wiederverwendbare Abfragelogik direkt in Ihren Models zu definieren. Durch die Verkettung benutzerdefinierter Methoden mit Djangos QuerySet-Methoden erstellen Sie eine fluente API für häufige Abfragen. Der Standardmanager objects bleibt verfügbar, während ein benutzerdefinierter published Manager für veröffentlichungsspezifische Abfragen hinzugefügt wird.
snippet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from django.db import modelsfrom django.utils import timezoneclass PublishedManager(models.Manager):def get_queryset(self):return super().get_queryset().filter(status='published')def by_year(self, year):return self.get_queryset().filter(published_at__year=year)def this_month(self):now = timezone.now()return self.get_queryset().filter(published_at__month=now.month,published_at__year=now.year)class Article(models.Model):title = models.CharField(max_length=200)status = models.CharField(max_length=10, default='draft')published_at = models.DateTimeField(null=True, blank=True)objects = models.Manager()published = PublishedManager()class Meta:ordering = ['-published_at']# Usage examples:Article.published.all() # Only published articlesArticle.published.by_year(2024) # Published in 2024Article.published.this_month() # Published this monthArticle.published.by_year(2024).count()
django
Erklärung
1
class PublishedManager(models.Manager):
Erweitere models.Manager um benutzerdefinierten Manager mit veröffentlichungsspezifischer Logik zu erstellen
2
def get_queryset(self):
Überschreibe um gefilterte Queryset standardmäßig zurückzugeben - nur 'published' Status-Artikel
3
def by_year(self, year):
Benutzerdefinierte Methode die QuerySet nach Veröffentlichungsjahr gefiltert zurückgibt, verkettbar
4
def this_month(self):
Verwendet timezone.now() um Artikel des aktuellen Monats zu filtern
5
objects = models.Manager()
Behalte Standard Manager alongside benutzerdefiniertem Manager verfügbar
6
published = PublishedManager()
Benutzerdefinierte Manager-Instanz ermöglicht Article.published.* Abfrageinterface
7
Article.published.by_year(2024).count()
Verkette benutzerdefinierte Methoden mit QuerySet-Methoden für leistungsstarke, lesbare Abfragen