0 Tage Serie
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
python
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 models
from django.utils import timezone
class 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 articles
Article.published.by_year(2024) # Published in 2024
Article.published.this_month() # Published this month
Article.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