De .values() methode van Django biedt de functie om wanneer een QuerySet wordt uitgevoerd, alleen specifieke velden te selecteren en terug te geven. Met deze methode wordt het resultaat teruggegeven in de vorm van een lijst van dictionaries, waarbij alle modelvelden worden uitgesloten en alleen de opgegeven velden worden gehaald.

📌 Belangrijkste kenmerken:

  • Een gewone QuerySet (Model.objects.all()) retourneert een lijst van objecten (Model-instanties), maar
  • bij gebruik van .values() wordt een lijst van dictionaries (dictlijst) geretourneerd.

🛠 1. Basisgebruik

from myapp.models import Post

# Bestaande QuerySet (geeft modelinstanties met alle velden terug)
posts = Post.objects.all()  
print(posts)  
# , ]>

# .values() gebruiken (alleen title en author velden)
posts = Post.objects.values('title', 'author')  
print(posts)  
# 

📌 Verschil:

  • Post.objects.all()geeft lijst van instanties van het Post-model terug
  • Post.objects.values('title', 'author')geeft lijst van dictionaries (dict) terug

🛠 2. Prestatieoptimalisatie van .values()

Door gebruik te maken van .values() kunt u onnodige veldbelasting voorkomen, wat leidt tot betere queryprestaties. Dat betekent dat echter alleen de benodigde velden worden opgehaald, waardoor de databasebelasting vermindert.

# Haal alle modelobjecten op (inefficiënt)
Post.objects.all()

# Haal alleen de benodigde velden op (efficiënt)
Post.objects.values('title', 'author')

🛠 3. Verschil tussen .values() en .values_list()

.values() → geeft lijst van dictionaries (dict) terug

Post.objects.values('id', 'title')
# <QuerySet [{'id': 1, 'title': 'eerste bericht'}, {'id': 2, 'title': 'tweede bericht'}]>

.values_list() → geeft lijst van tuples terug

Post.objects.values_list('id', 'title')
# <QuerySet [(1, 'eerste bericht'), (2, 'tweede bericht')]>

🛠 4. Gebruik van .values() samen met annotate()

Wanneer u annotate() samen met .values() gebruikt, kunt u geaggregeerde gegevens in de vorm van dictionaries ophalen.

from django.db.models import Count
from myapp.models import Post, Comment

# Aantal reacties per bericht ophalen
Post.objects.values('title').annotate(comment_count=Count('comments'))

🛠 5. Filtering met .values() (gebruik samen met distinct())

Voorbeeld: Haal de titels op van alle berichten geschreven door een specifieke author, maar verwijder duplicaten:

Post.objects.values('title').filter(author=1).distinct()

📌 Conclusie

  • .values() converteert een QuerySet naar een lijst van dictionaries (dict) met alleen de geselecteerde velden.
  • ✅ U kunt de prestaties van een query optimaliseren door onnötige velden te vermijden.
  • ✅ In vergelijking met .values_list() geeft .values() een dictionary en .values_list() een tuple terug.
  • ✅ U kunt gebruik maken van .annotate() om geaggregeerde gegevens in dictionaryvorm op te halen.
  • ✅ U kunt duplicates verwijderen door gebruik te maken van .distinct().

💡 De .values() methode is een krachtige functie voor het optimaliseren van prestaties door onnodige velden te verminderen bij gegevensopvraging! 🚀 Het is zeer nuttig wanneer u gegevens wilt ophalen in de vorm van dictionaries in plaats van modelobjecten, afhankelijk van uw doel! 😊

Django QuerySet .values() method concept

Oh! Zoals je misschien al hebt opgemerkt uit de resultaten in de bovenstaande voorbeelden, de .value() en .value_list() die een lijst van dictionaries teruggeven, zijn nog steeds querysets. (Aangezien ze als lazy worden geëvalueerd, als je onmiddellijke evaluatie nodig hebt, vergeet niet om ze in list() te wikkelen!)