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.

  1. 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')

  1. 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ó

  1. Crea un model Customer amb els camps name (CharField) i email (EmailField).
  2. Filtra els clients que tenen un nom que comença amb 'A'.
  3. 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

  1. Crea un model Order amb els camps customer (ForeignKey a Customer), total (DecimalField) i date (DateField).
  2. Anota el nombre de comandes per cada client.
  3. 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ó.

© Copyright 2024. Tots els drets reservats