__(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 Order
→ Profile
→ CustomUser
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.
댓글이 없습니다.