Gegevensopvraging met Django ORM is een van de krachtigste functies van Django. QuerySet is het basisinstrument om gegevens efficiënt van het Django-model op te halen, en met dit hulpmiddel kunnen zelfs complexe gegevensopvragingen eenvoudig worden afgehandeld. In dit artikel bekijken we wat een QuerySet is, hoe je deze kunt gebruiken, en de verschillende functies die nuttig zijn voor gegevensopvraging.


1. Wat is een QuerySet?

QuerySet is een verzameling van objecten die worden gebruikt om gegevens van de database op te halen of te manipuleren in Django ORM. Kortom, een QuerySet is een verzameling van de resultaten van een databasequery. Met een QuerySet kun je modelobjecten ophalen, filteren en manipuleren.

QuerySets kapselen de interactie met de database in, zodat ontwikkelaars gegevens kunnen opvragen of manipuleren met intuïtieve Python-code zonder dat ze SQL rechtstreeks hoeven te schrijven.

Django QuerySet infographic

Wat je met een QuerySet kunt doen

  • Gegevensopvraging: Opvragen van records die in de database zijn opgeslagen onder verschillende voorwaarden.
  • Filteren: Meerdere voorwaarden toepassen om alleen de gewenste gegevens te selecteren.
  • Schoonmaken en snijden: Gegevens in de gewenste volgorde sorteren of gegevens binnen een bepaalde range ophalen.

2. Soorten basisopvraagmethoden en voorbeelden van gebruik

Django ORM biedt verschillende basisopvraagmethoden. Deze methoden zijn zeer nuttig voor het eenvoudig opvragen en filteren van gegevens.

2.1 all()

Een methode die wordt gebruikt wanneer je alle gegevens van een model wilt ophalen.

from myapp.models import Post

posts = Post.objects.all()
  • Post.objects.all() haalt alle objecten die zijn opgeslagen in het Post-model op.

2.2 filter()

Gebruik deze methode om alleen objecten met specifieke voorwaarden op te halen.

published_posts = Post.objects.filter(status='published')
  • filter() haalt objecten op die aan de voorwaarden voldoen en de teruggegeven resultaten zijn een QuerySet.

2.3 exclude()

Gebruik deze methode om objecten op te halen die niet aan specifieke voorwaarden voldoen.

draft_posts = Post.objects.exclude(status='published')
  • exclude() haalt objecten op die niet voldoen aan de voorwaarden, tegenovergesteld aan filter().

2.4 get()

Gebruik deze methode om een enkel object op te halen dat aan specifieke voorwaarden voldoet. Let op, als er geen of meer dan één overeenkomstig object is, wordt er een foutmelding gegeven.

post = Post.objects.get(id=1)
  • get() wordt gebruikt om precies één object op te halen, en als er geen of meerdere objecten zijn, ontstaat er een DoesNotExist of MultipleObjectsReturned fout.

3. Operators en filtering in ORM

QuerySets stellen ontwikkelaars in staat om verschillende operators te gebruiken om complexe filtervoorwaarden te verwerken. Door deze operators te gebruiken, kunnen gegevens met zeer gedetailleerde voorwaarden worden gefilterd.

3.1 exact

Gebruik deze operator wanneer je exact overeenkomende waarden wilt vinden.

post = Post.objects.filter(title__exact='Mijn Eerste Post')
  • title__exact filtert objecten waarvan de titel exact 'Mijn Eerste Post' is.

3.2 icontains

Gebruik deze operator om te controleren of een gedeeltelijke substring aanwezig is, ongeacht de hoofdletters.

posts = Post.objects.filter(title__icontains='django')
  • title__icontains haalt alle berichten op waarvan de titel 'django' bevat.

3.3 gt, lt (groter dan, kleiner dan)

Gebruik deze operatoren om voorwaarden te stellen voor grotere of kleinere numerieke of datumwaarden.

recent_posts = Post.objects.filter(publish_date__gt='2024-01-01')
  • publish_date__gt filtert berichten die zijn gepubliceerd na 2024-01-01. gt betekent greater than, en lt betekent less than.

Bovendien kunnen andere diverse operators zoals startswith, endswith, en in worden gebruikt om uitgebreide filtervoorwaarden eenvoudig te implementeren.


4. Back-referentie: Relaties tussen modellen via buitenlandse sleutels opvragen

In Django ORM verwijst back-referentie naar het opvragen van gegevens via de relatie die is gemaakt met een buitenlandse sleutel (Foreign Key). Door back-referenties te gebruiken, is het eenvoudig om de relatie tussen ouder- en kindmodellen in een relationele database op te vragen.


4.1 Back-referentie met related_name

Wanneer je een buitenlandse sleutel definieert, kun je de optie related_name gebruiken om leesbaarere namen voor back-referenties te krijgen.

Voorbeeld
class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    text = models.TextField()
Hoe te gebruiken
post = Post.objects.get(id=1)
comments = post.comments.all()
  • Met post.comments.all() kun je alle opmerkingen ophalen die aan die post zijn gekoppeld. Als er geen related_name is ingesteld, wordt standaard comment_set gebruikt.

Conclusie

QuerySet van Django ORM is een krachtig hulpmiddel voor interactie met databases, dat het mogelijk maakt om doelgerichte gegevens efficiënt op te vragen en te manipuleren via verschillende methoden en operators. In dit artikel hebben we gekeken naar de basisprincipes van het gebruik van QuerySet, evenals naar het filteren van gegevens en het werken met back-referenties.

De delen die hierboven zijn gepresenteerd zijn slechts de basisintroductie tot de opvraagfunctionaliteit van ORM. In werkelijkheid heeft Django's QuerySet veel meer diverse en krachtige methoden, en kun je deze methoden combineren om gegevens op te vragen. In de toekomst zal ik posts schrijven waarin ik de verschillende methoden van QuerySet een voor een introduceer en analyseer.

In de volgende editie gaan we in op prestatieoptimalisatie van de QuerySet en het concept van luid evalueren (lazy evaluation), en leren we hoe we onze datatoegang kunnen verbeteren. Blijf op de hoogte!