__(dubbele underscore) wat is dat?

In Django wordt __(dubbele underscore) gebruikt om databasequery's te schrijven via relatievelden tussen modellen. In het kort, het wordt gebruikt om toegang te krijgen tot velden die zijn verbonden met andere tabellen of om gegevens met specifieke voorwaarden te filteren.

Bijvoorbeeld, wanneer twee of meer modellen met elkaar verbonden zijn via ForeignKey of OneToOneField, kunnen we via die relatie toegang krijgen tot de gewenste velden. Hier fungeert __ als een soort "verbinding", waarmee we de velden van verschillende modellen als een keten met elkaar verbinden om toegang te krijgen.

Voorbeeld: Gebruik van __ in relaties tussen modellen

We geven een eenvoudig voorbeeld. Stel dat het Profile model is verbonden met het User model, en dat het gebruikersmodel een veld username bevat. We kunnen specifieke profielen filteren op basis van de username van het User model in het Profile model.

Modeldefinitie:

from django.db import models
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    pass

class Profile(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    bio = models.TextField()

In het bovenstaande voorbeeld is het Profile model 1:1 verbonden met CustomUser. Laten we nu zien hoe we met __ toegang krijgen tot de velden van CustomUser vanuit Profile.

Query met __:

# Profielobjecten filteren op basis van de username van CustomUser
profiles = Profile.objects.filter(user__username='jesse')

Hier is user__username de sleutel. user is het veld dat is verbonden met CustomUser in het Profile model en om toegang te krijgen tot het username veld, moeten we het met __ verbinden. Op deze manier kunnen we gegevens ophalen op basis van het username veld van CustomUser in het Profile model.

Diverse toepassingen van __

__ wordt vaak gebruikt, niet alleen voor toegang tot velden, maar ook voor het opleggen van voorwaarden. Django biedt verschillende filterfuncties binnen querysets om diverse voorwaarden in te stellen, waarvan de meeste worden geïmplementeerd via __. Veelgebruikte voorwaarden zijn:

  • exact: Zoekt naar exact overeenkomende waarden. (kan worden weggelaten omdat dit de standaard is)
  • icontains: Zoekt naar waarden die zonder hoofdlettergevoeligheid zijn opgenomen.
  • gt, lt, gte, lte: Voorwaarden voor waarden die groter of kleiner zijn (greater than, less than).
  • startswith, endswith: Zoekt naar waarden die beginnen of eindigen met een bepaalde tekenreeks.

Voorbeeld: Diverse filtervoorwaarden

# Alle profielen ophalen waarvan het emailadres van CustomUser 'gmail.com' bevat
profiles_with_gmail = Profile.objects.filter(user__email__icontains='gmail.com')

# Profielen ophalen waarvan het ID van CustomUser groter is dan 10
profiles_with_id_gt_10 = Profile.objects.filter(user__id__gt=10)

# Profielen ophalen waarvan de username van CustomUser begint met 'jesse'
profiles_starting_with_jesse = Profile.objects.filter(user__username__startswith='jesse')

Toegang tot meerdere relatievelden via __

Een van de krachtigste functies in Django is dat, zelfs wanneer meerdere modellen zijn verbonden, we gegevens kunnen ophalen door meerdere relaties te volgen met behulp van __. Stel je voor dat er een model Order is dat is verbonden met Profile, en dat Profile opnieuw is verbonden met CustomUser.

Voorbeeld van meerdere relatie modellen:

class Order(models.Model):
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
    order_date = models.DateTimeField()
    amount = models.DecimalField(max_digits=10, decimal_places=2)

Stel nu dat we gegevens vanuit Order willen ophalen op basis van de username van CustomUser.

Filteren via meerdere relaties:

# Bestellingen ophalen waarvan de username van CustomUser 'jesse' is
orders_for_user = Order.objects.filter(profile__user__username='jesse')

Hier kunnen we via profile__user__username toegang krijgen tot de velden van CustomUser door meerdere niveaus van relaties te volgen. We hebben de relatie OrderProfileCustomUser eenvoudig gefilterd door ze te verbinden met __.

Samenvatting

  • __ wordt gebruikt om velden te verwijzen die de relaties tussen modellen volgen.
  • We kunnen verschillende queryvoorwaarden instellen om gegevens te filteren.
  • We kunnen complexe query's eenvoudig afhandelen door velden van meerdere relaties te verbinden.

Aangezien je nu de rol en het gebruik van __ begrijpt, zou je in staat moeten zijn om krachtigere query's te schrijven in Django ORM. Door na te denken over de relationele structuur van de database en dit symbool op de juiste manier te gebruiken, kun je efficiënte gegevensverwerking bereiken en complexe relaties eenvoudig beheren.