In de vorige post heb ik de manier besproken waarop je gegevens behandelt met de ORM van Django, namelijk de CRUD (Create, Read, Update, Delete) operaties. Deze keer wil ik dieper ingaan op wat de objects
manager precies is, hoe deze is opgebouwd en wat je ermee kunt doen. Het objects
concept is een belangrijke basis die je moet begrijpen om de Django ORM goed te doorgronden.
1. Wat is de objects
manager?
Een van de meest voorkomende elementen in de basisstructuur van een Django-model is de manager die objects
heet. objects
wordt de modelmanager (Manager) van Django genoemd en is verantwoordelijk voor het ophalen of manipuleren van database records. Simpel gezegd, de objects
manager fungeert als de brug tussen de modelklasse en de database.

De basiskenmerk van de modelklasse, objects
, is een instantie van de Manager klasse die door Django wordt aangeboden. Via deze instantie communiceer je met de database en voer je taken uit zoals creëren, zoeken, wijzigen en verwijderen van gegevens. Je kunt bijvoorbeeld toegang krijgen tot gegevens met methoden zoals Post.objects.all()
of Post.objects.create()
.
2. De rol van de Manager klasse
De Manager klasse biedt een interface naar de database die standaard aan het Django-model is toegewezen. Hiermee kunnen verschillende queries worden uitgevoerd. Standaard genereert Django automatisch een Manager
met de naam objects
voor elk model, en gebruikt deze Manager
om het merendeel van de CRUD operaties af te handelen.
Je hebt misschien al enige kennis of ervaring met hoe CRUD via objects
wordt geïmplementeerd. De voorbeeldcode is in de vorige aflevering behandeld, dus ik zal dat hier overslaan.
3. Een aangepaste Manager maken
De standaard objects
manager is zeer nuttig, maar soms is het nodig om bepaalde query logica te hergebruiken of complexere opvragingen uit te voeren. In zulke gevallen kun je een aangepaste manager maken om de gewenste functionaliteit toe te voegen.
3.1 Een aangepaste Manager klasse definiëren
Laten we bijvoorbeeld een aangepaste manager maken die alleen gepubliceerde berichten filtert.
from django.db import models
class PublishedManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(status='published')
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
status = models.CharField(max_length=10, choices=[('draft', 'Draft'), ('published', 'Gepubliceerd')])
publish_date = models.DateTimeField(auto_now_add=True)
# Voeg een aangepaste manager toe naast de standaard objects manager
published = PublishedManager()
In het bovenstaande voorbeeld hebben we een aangepaste manager PublishedManager
gedefinieerd en deze toegevoegd aan het Post
model. Deze PublishedManager
filtert en retourneert alleen de berichten waarvan de status 'published'
is. Nu kun je vraagstukken ophalen via Post.published.all()
en alleen de gepubliceerde berichten krijgen.
3.2 Toepassing van de aangepaste manager
- Vermijden van duplicatie van code: Door een aangepaste manager te gebruiken, kun je duplicatie in de code verminderen in plaats van steeds opnieuw filtervoorwaarden toe te voegen.
- Geëngageerde query logica encapsuleren: Je kunt de query logica op maat maken om aan specifieke zakelijke vereisten te voldoen, waardoor je deze eenvoudig kunt beheren binnen het model.
4. Diverse acties die je met de objects
manager kunt uitvoeren
De objects
manager van Django ondersteunt naast de basis CRUD functionaliteiten ook meer diverse database operaties.
4.1 Gegevens filteren
filter()
: Haal meerdere objecten op die aan bepaalde voorwaarden voldoen.published_posts = Post.objects.filter(status='published')
exclude()
: Haal objecten op die niet aan bepaalde voorwaarden voldoen.draft_posts = Post.objects.exclude(status='published')
4.2 Sorteren en afsnijden
- Sorteren: Je kunt gegevens sorteren met behulp van de
order_by()
methode.recent_posts = Post.objects.all().order_by('-publish_date')
- Afsnijden: Net als bij het afsnijden van lijsten in Python, kun je ook binnen querysets specifieke gegevensreeksen ophalen.
first_three_posts = Post.objects.all()[:3]
4.3 Aggregatiefuncties gebruiken
De objects
manager biedt ook aggregatiefuncties. Als je bijvoorbeeld het aantal berichten wilt weten, kun je de count()
methode gebruiken.
post_count = Post.objects.count()
Bovendien kun je met de aggregate()
methode aggregatiebewerkingen zoals gemiddelden en totalen uitvoeren.
from django.db.models import Avg
average_length = Post.objects.aggregate(Avg('content_length'))
5. Werking van de objects
manager
De objects
manager creëert intern een queryset (QuerySet) object. Een queryset is een verzameling van queries die zijn ontworpen om gegevens uit de database op te halen. Wanneer methoden zoals objects.all()
of objects.filter()
worden aangeroepen, genereert Django een queryset en, indien nodig, wordt die query naar de database gestuurd om resultaten op te halen.
Querysets maken gebruik van lazily evaluation. Dit betekent dat bij het genereren van de queryset op dat moment geen data uit de database wordt opgehaald, maar dat de database-query wordt uitgevoerd op het moment dat de gegevens daadwerkelijk nodig zijn. Hiermee voorkom je onnodige query-executies en kun je gegevens efficiënt verwerken.
Conclusie
De objects
manager van Django is een krachtig hulpmiddel dat de interactie met de database vereenvoudigt en helpt bij het eenvoudiger omgaan met gegevens. Naast de standaard CRUD functionaliteiten kun je aangepaste managers definiëren om specifieke querylogica te hergebruiken of complexere taken eenvoudig af te handelen. Bovendien maakt de eigenschap van lazy evaluation binnen querysets een efficiënte gegevensverwerking mogelijk.
Door de objects
manager van Django ORM goed te begrijpen, kun je de database efficiënter beheren en de duplicatie in de code verminderen, wat leidt tot een nettere code. Vergroot de bruikbaarheid van de modelmanager en introduceer waar nodig aangepaste managers. Dit zal de complexe dataverwerking binnen je webapplicatie veel eenvoudiger en flexibeler maken.
In de volgende aflevering zullen we de queryset (QuerySet) en gegevensopvraging in detail bespreken. Een van de voordelen van de ORM is dat "je SQL niet hoeft te weten", en om deze voordelen volledig te benutten, is de inhoud van de volgende aflevering van groot belang. Blijf uitkijken naar de volgende aflevering.
댓글이 없습니다.