python / expert
Snippet
Django Model Meta Optionen mit Custom Manager Verknüpfung
Dieses Snippet zeigt Djangos leistungsstarke Model Meta Optionen und Custom Manager Verknüpfung. Das Article Model implementiert einen geschichteten Manager-Ansatz wobei PublishedManager ActiveManager erweitert und eine Kette von gefilterten Querysets erstellt. Die Meta-Klasse definiert zusammengesetzte Indizes für Performance, Datenbank-Level Constraints für Datenintegrität und Standard-Sortierung. Custom Classmethods bieten benutzerspezifische Sichtbarkeitslogik.
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from django.db import modelsfrom django.db.models import Qfrom django.utils import timezoneclass ActiveManager(models.Manager):def get_queryset(self):return super().get_queryset().filter(is_active=True)class PublishedManager(ActiveManager):def get_queryset(self):return super().get_queryset().filter(Q(published_at__isnull=True) | Q(published_at__lte=timezone.now()))class Article(models.Model):title = models.CharField(max_length=200)slug = models.SlugField(unique=True)content = models.TextField()is_active = models.BooleanField(default=True)published_at = models.DateTimeField(null=True, blank=True)author = models.ForeignKey('auth.User', on_delete=models.CASCADE)created_at = models.DateTimeField(auto_now_add=True)objects = models.Manager()active = ActiveManager()published = PublishedManager()class Meta:indexes = [models.Index(fields=['slug']),models.Index(fields=['-published_at', 'is_active']),]constraints = [models.UniqueConstraint(fields=['author', 'slug'],name='unique_author_slug')]ordering = ['-created_at']verbose_name = 'Article'verbose_name_plural = 'Articles'def __str__(self):return self.title@classmethoddef get_visible_for_user(cls, user):if user.is_staff:return cls.objects.all()return cls.published.all()
django
Erklärung
1
class ActiveManager(models.Manager):
Erstelle Custom Manager der nach aktiven Datensätzen filtert, wiederverwendbar über mehrere Modelle
2
objects = models.Manager(); active = ActiveManager(); published = PublishedManager()
Weise mehrere Manager-Instanzen dem Model zu um verschiedene Query-Perspektiven gleichzeitig zu ermöglichen
3
models.Index(fields=['-published_at', 'is_active'])
Definiere zusammengesetzten Index mit absteigender Ordnung für effiziente chronologische Queries mit Status-Filterung
4
models.UniqueConstraint(fields=['author', 'slug'])
Füge Datenbank-Level Constraint hinzu der Author-Slug-Kombination auf Datenbankebene eindeutig macht
5
@classmethod def get_visible_for_user(cls, user):
Erstelle Classmethod der basierend auf Benutzerberechtigungen entsprechende Querysets für Sichtbarkeitslogik zurückgibt