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.

Django objects manager diagram

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.