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
Customeramb 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
Orderamb 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
