En aquest tema, explorarem com realitzar consultes avançades utilitzant l'Object-Relational Mapping (ORM) de Django. L'ORM de Django és una eina poderosa que permet interactuar amb la base de dades utilitzant models Python en lloc de SQL cru. Això facilita la manipulació de dades i la creació de consultes complexes de manera més intuïtiva.
Objectius
- Comprendre les consultes bàsiques i avançades amb Django ORM.
- Aprendre a utilitzar filtres, anotacions i agregacions.
- Explorar les relacions entre models i com fer consultes sobre aquestes relacions.
- Consultes Bàsiques
Filtratge de Dades
El mètode filter()
s'utilitza per obtenir un conjunt de dades que compleixen certes condicions.
# Exemple de model class Product(models.Model): name = models.CharField(max_length=100) price = models.DecimalField(max_digits=10, decimal_places=2) stock = models.IntegerField() # Filtrar productes amb un preu superior a 50 expensive_products = Product.objects.filter(price__gt=50)
Ordenació de Resultats
El mètode order_by()
s'utilitza per ordenar els resultats.
# Ordenar productes per preu de manera ascendent products = Product.objects.order_by('price') # Ordenar productes per preu de manera descendent products = Product.objects.order_by('-price')
- Consultes Avançades
Anotacions i Agregacions
Les anotacions permeten afegir informació calculada a cada objecte del queryset. Les agregacions permeten calcular valors com sumes, mitjanes, etc., sobre un conjunt de dades.
from django.db.models import Count, Avg, Sum # Anotar el nombre de productes en cada categoria categories = Category.objects.annotate(num_products=Count('product')) # Agregar el preu mitjà de tots els productes average_price = Product.objects.aggregate(Avg('price')) # Agregar la suma total de tots els productes en estoc total_stock = Product.objects.aggregate(Sum('stock'))
Consultes sobre Relacions
Django ORM permet fer consultes sobre relacions entre models utilitzant claus foranes.
# Exemple de models amb relació class Category(models.Model): name = models.CharField(max_length=100) class Product(models.Model): name = models.CharField(max_length=100) price = models.DecimalField(max_digits=10, decimal_places=2) category = models.ForeignKey(Category, on_delete=models.CASCADE) # Filtrar productes d'una categoria específica category = Category.objects.get(name='Electronics') products_in_category = Product.objects.filter(category=category)
Consultes Complexes amb Q Objects
Els Q objects permeten construir consultes complexes amb condicions lògiques.
from django.db.models import Q # Filtrar productes que tenen un preu superior a 50 o que estan en estoc products = Product.objects.filter(Q(price__gt=50) | Q(stock__gt=0))
Exercicis Pràctics
Exercici 1: Filtratge i Ordenació
- Crea un model
Customer
amb els campsname
(CharField) iemail
(EmailField). - Filtra els clients que tenen un nom que comença amb 'A'.
- Ordena els clients per nom de manera ascendent.
# Solució class Customer(models.Model): name = models.CharField(max_length=100) email = models.EmailField() # Filtrar clients customers_with_a = Customer.objects.filter(name__startswith='A') # Ordenar clients ordered_customers = Customer.objects.order_by('name')
Exercici 2: Anotacions i Agregacions
- Crea un model
Order
amb els campscustomer
(ForeignKey aCustomer
),total
(DecimalField) idate
(DateField). - Anota el nombre de comandes per cada client.
- Calcula la suma total de totes les comandes.
# Solució class Order(models.Model): customer = models.ForeignKey(Customer, on_delete=models.CASCADE) total = models.DecimalField(max_digits=10, decimal_places=2) date = models.DateField() # Anotar nombre de comandes per client customers_with_order_count = Customer.objects.annotate(num_orders=Count('order')) # Calcular suma total de totes les comandes total_sales = Order.objects.aggregate(Sum('total'))
Conclusió
En aquesta secció, hem après a realitzar consultes avançades utilitzant l'ORM de Django. Hem explorat com filtrar, ordenar, anotar i agregar dades, així com com treballar amb relacions entre models. Aquestes habilitats són essencials per gestionar dades de manera eficient en aplicacions Django.
En el proper tema, explorarem com crear models d'usuari personalitzats per adaptar l'autenticació d'usuaris a les necessitats específiques de la teva aplicació.
Curs de Desenvolupament Web amb Django
Mòdul 1: Introducció a Django
- Què és Django?
- Configuració de l'Entorn de Desenvolupament
- Creació del teu Primer Projecte Django
- Comprensió de l'Estructura del Projecte Django
Mòdul 2: Conceptes Bàsics de Django
- Aplicacions Django i Estructura del Projecte
- Enrutament d'URL i Vistes
- Plantilles i Fitxers Estàtics
- Models i Bases de Dades
- Interfície d'Administració de Django
Mòdul 3: Django Intermedi
Mòdul 4: Django Avançat
- Consultes Avançades amb Django ORM
- Models d'Usuari Personalitzats
- Senyalitzacions de Django
- Proves en Django
- Optimització del Rendiment