Jugando Con El ORM de Django - PyConAr
Jugando Con El ORM de Django - PyConAr
Jugando Con El ORM de Django - PyConAr
Federico Martínez
Santiago Avendaño
¿Qué es un ORM?
¿Qué es un ORM?
Object
Relational
Mapper
¿Qué es un ORM?
Modelo
Objetos relacional
(Tablas)
SQL
En esta charla:
● Conceptos de bases de datos (relacionales)
● ORM de Django
● Problemas comunes
Y por qué hablar de
bases de datos relacionales?
Bases de datos relacionales
Bases de datos relacionales
● Implementación de la teoría del álgebra
relacional
Bases de datos relacionales
● Implementación de la teoría del álgebra
relacional
● Usamos tablas que tiene registros
Bases de datos relacionales
● Implementación de la teoría del álgebra
relacional
● Usamos tablas que tienen registros
● Estan buenísimas
¿Qué es una tabla?
¿Qué es una tabla?
class Book(models.Model):
title = models.CharField(max_length=100)
pages = models.PositiveIntegerField()
genre = models.ForeignKey(
Genre, on_delete=models.CASCADE
)
authors = models.ManyToManyField(
Writer, related_name='books'
)
Managers y Querysets
all_books = Book.objects.all() SELECT *
FROM library_book
Filtros
Book.objects.filter( SELECT *
title__contains='anillos' FROM library_book
) WHERE
title LIKE '%anillos%';
Joins
Book.objects.filter( SELECT *
authors__user__username='JRR' FROM library_book
) INNER JOIN library_book_authors
ON library_book.id =
library_book_authors.book_id
INNER JOIN library_writer ON
(library_book_authors.writer_id =
library_writer.id)
INNER JOIN auth_user ON
library_writer.user_id=auth_user.id
WHERE auth_user.username = 'JRR'
Indices
class Book(models.Model):
...
pages = models.PositiveIntegerField(
db_index=True
)
class Writer(models.Model):
class Meta:
indexes = [
models.Index(
fields=['last_name','first_name']),
)
Problemas comunes
Procesar datos en Python
pages_list = Book.objects.all() from django.db.models import Max
.values_list('pages', flat=True)
max_pages = \
max_pages = max(pages_list) Book.objects.all().aggregate(
Max('pages')
)['pages__max']
Muchas queries
all_books = Book.objects.all()
for b in all_books:
print(b.title, b.genre.name)
for b in all_books_with_writers:
print(b.title, b.authors.all())
Book.objects.filter(authors__user__username__contains='J')
Book.objects.filter(authors__user__username__contains='JR')
Book.objects.filter(authors__user__username__contains='JRR')
Book.objects.filter(authors__user__username__contains='JRR ')
Procesamientos innecesarios
● Traer datos que no son necesarios
Book.objects.all().select_related('genre').values('title', 'genre__name')