Die .values()-Methode von Django bietet die Funktion, beim Ausführen eines QuerySet nur bestimmte Felder auszuwählen und zurückzugeben. Mit dieser Methode wird das Ergebnis als Liste von Dictionaries zurückgegeben, sodass nur die angegebenen Felder und nicht alle Modellfelder abgerufen werden können.

📌 Hauptmerkmale:

  • Ein normales QuerySet (Model.objects.all()) gibt eine Liste von Objekten (Model-Instanzen) zurück, während
  • bei Verwendung von .values() eine Liste von Dictionaries zurückgegeben wird.

🛠 1. Grundlegende Verwendung

from myapp.models import Post

# Bestehendes QuerySet (gibt Modellinstanzen mit allen Feldern zurück)
posts = Post.objects.all()  
print(posts)  
# , ]>

# Verwendung von .values() (nur die Felder title und author abrufen)
posts = Post.objects.values('title', 'author')  
print(posts)  
# 

📌 Unterschiede:

  • Post.objects.all()Listet Instanzen des Post-Modells auf
  • Post.objects.values('title', 'author')Gibt eine Liste von Dictionaries zurück

🛠 2. Leistungsoptimierung von .values()

Die Verwendung von .values() hilft, unnecessary field loading zu vermeiden und die Abfrageleistung zu verbessern. Das bedeutet, dass nur die benötigten Felder abgerufen werden, wodurch die Datenbanklast reduziert wird.

# Abrufen des gesamten Modellobjekts (ineffizient)
Post.objects.all()

# Nur die benötigten Felder abrufen (effizient)
Post.objects.values('title', 'author')

🛠 3. Unterschiede zwischen .values() und .values_list()

.values() → Gibt eine Liste von Dictionaries zurück

Post.objects.values('id', 'title')
# <QuerySet [{'id': 1, 'title': 'Erster Blogeintrag'}, {'id': 2, 'title': 'Zweiter Blogeintrag'}]>

.values_list() → Gibt eine Liste von Tupeln zurück

Post.objects.values_list('id', 'title')
# <QuerySet [(1, 'Erster Blogeintrag'), (2, 'Zweiter Blogeintrag')]>

🛠 4. Verwendung von .values() zusammen mit annotate()

Durch die Kombination von annotate() und .values() können aggregierte Daten in Form von Dictionaries abgerufen werden.

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

# Anzahl der Kommentare für jeden Beitrag abrufen
Post.objects.values('title').annotate(comment_count=Count('comments'))

🛠 5. Filtern mit .values() (in Kombination mit distinct())

Beispiel: Abrufen der Titel aller Beiträge eines bestimmten author und Entfernen von Duplikaten:

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

📌 Fazit

  • .values() konvertiert das QuerySet in eine Liste von Dictionaries und ruft nur bestimmte Felder ab.
  • ✅ Durch das Ausschließen unnötiger Felder kann die Abfrageleistung optimiert werden.
  • .values() gibt Dictionaries zurück, während .values_list() Tupel zurückgibt.
  • ✅ In Kombination mit .annotate() können aggregierte Daten in Form von Dictionaries abgerufen werden.
  • ✅ Durch die Verwendung von .distinct() können Duplikate entfernt werden.

💡 .values() ist eine leistungsstarke Funktion zur Optimierung der Abfrageleistung durch Reduzierung unnötiger Felder! 🚀 Je nach Verwendungszweck ist es sehr nützlich, um Daten in Form von Dictionaries anstelle von Modellobjekten abzurufen! 😊

Django QuerySet .values() method concept

Ah! Einige von Ihnen haben vielleicht bereits die Ergebnisse der obigen Beispiele bemerkt: Die von .value() und .value_list() zurückgegebenen Listen von Dictionaries sind immer noch QuerySets. (Da sie verzögert ausgewertet werden, denken Sie daran, sie bei Bedarf mit list() zu umschließen!)