Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT *...
Transcript of Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT *...
![Page 1: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/1.jpg)
Jugando con el ORM de DjangoFederico MartínezSantiago Avendaño
![Page 2: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/2.jpg)
¿Qué es un ORM?
![Page 3: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/3.jpg)
¿Qué es un ORM?Object
Relational
Mapper
![Page 4: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/4.jpg)
¿Qué es un ORM?
Objetos
Modelo
relacional
(Tablas)
![Page 5: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/5.jpg)
SQL
![Page 6: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/6.jpg)
En esta charla:● Conceptos de bases de datos (relacionales)
● ORM de Django
● Problemas comunes
![Page 7: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/7.jpg)
Y por qué hablar debases de datos relacionales?
![Page 8: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/8.jpg)
Bases de datos relacionales
![Page 9: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/9.jpg)
Bases de datos relacionales● Implementación de la teoría del álgebra
relacional
![Page 10: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/10.jpg)
Bases de datos relacionales● Implementación de la teoría del álgebra
relacional
● Usamos tablas que tiene registros
![Page 11: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/11.jpg)
Bases de datos relacionales● Implementación de la teoría del álgebra
relacional
● Usamos tablas que tienen registros
● Estan buenísimas
![Page 12: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/12.jpg)
¿Qué es una tabla?
![Page 13: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/13.jpg)
¿Qué es una tabla?
Col 1 Col 2 Col 3 Col 4A B C DX Y Z W
![Page 14: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/14.jpg)
¿Qué es una tabla?(en el fondo)
![Page 15: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/15.jpg)
¿Qué es una tabla?(en el fondo)
![Page 16: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/16.jpg)
SELECT * FROM tabla
![Page 17: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/17.jpg)
SELECT * FROM tabla
Leer todo el archivo!
![Page 18: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/18.jpg)
SELECT * FROM tabla WHERE col = 23
![Page 19: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/19.jpg)
SELECT * FROM tabla WHERE col = 23
Leer todo el archivo!
![Page 20: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/20.jpg)
Joins
![Page 21: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/21.jpg)
Joins
![Page 22: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/22.jpg)
SELECT * FROM tabla1, tabla2
![Page 23: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/23.jpg)
SELECT * FROM tabla1, tabla2
Leer todo el archivo2 por cada registro en archivo1!
![Page 24: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/24.jpg)
SELECT * FROM tabla1INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2
![Page 25: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/25.jpg)
SELECT * FROM tabla1INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2
Leer todo el archivo2 por cada registro en
archivo1!*
![Page 26: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/26.jpg)
SELECT * FROM tabla1, tabla2● Tabla 1: 1000
● Tabla 2: 1000
● Join 1000000
![Page 27: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/27.jpg)
Indices
![Page 28: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/28.jpg)
Indices
Col 2
1
2
3
Col 1 Col 2 Col 3 Col 4
1
1
2
3
1
2
1
3
3
![Page 29: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/29.jpg)
Indices● Búsqueda logarítmica
● Búsqueda por rango
● Claves compuestas
![Page 30: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/30.jpg)
IndicesChe, indexemos todo!
![Page 31: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/31.jpg)
Pero dónde está todo esto en Django???
![Page 32: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/32.jpg)
Modelosfrom django.db import models
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'
)
![Page 33: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/33.jpg)
Managers y Querysetsall_books = Book.objects.all() SELECT *
FROM library_book
![Page 34: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/34.jpg)
FiltrosBook.objects.filter(
title__contains='anillos'
)
SELECT *
FROM library_book
WHERE
title LIKE '%anillos%';
![Page 35: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/35.jpg)
JoinsBook.objects.filter(
authors__user__username='JRR'
)
SELECT *
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'
![Page 36: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/36.jpg)
Indicesclass Book(models.Model):
...
pages = models.PositiveIntegerField(
db_index=True
)
class Writer(models.Model):
class Meta:
indexes = [
models.Index(
fields=['last_name','first_name']),
)
![Page 37: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/37.jpg)
Problemas comunes
![Page 38: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/38.jpg)
Procesar datos en Pythonpages_list = Book.objects.all()
.values_list('pages', flat=True)
max_pages = max(pages_list)
from django.db.models import Max
max_pages = \
Book.objects.all().aggregate(
Max('pages')
)['pages__max']
![Page 39: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/39.jpg)
Muchas queriesall_books = Book.objects.all()
for b in all_books:
print(b.title, b.genre.name)
SELECT * FROM "library_book"
SELECT * FROM "library_genre" WHERE "library_genre"."id" = 4;
SELECT * FROM "library_genre" WHERE "library_genre"."id" = 4;
SELECT * FROM "library_genre" WHERE "library_genre"."id" = 4;
SELECT * FROM "library_genre" WHERE "library_genre"."id" = 4;
SELECT * FROM "library_genre" WHERE "library_genre"."id" = 5;
SELECT * FROM "library_genre" WHERE "library_genre"."id" = 6;
SELECT * FROM "library_genre" WHERE "library_genre"."id" = 6;
…
![Page 40: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/40.jpg)
Muchas queriesall_books = Book.objects.all().select_related("genre")
for b in all_books:
print(b.title, b.genre.name)
SELECT "library_book"."id", "library_book"."title",
"library_book"."pages", "library_book"."genre_id",
"library_book"."publication_date",
"library_genre"."id", "library_genre"."name"
FROM "library_book"
INNER JOIN "library_genre"
ON ("library_book"."genre_id" = "library_genre"."id");
![Page 41: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/41.jpg)
Muchas queriesall_books_with_writers = Book.objects.all().prefetch_related('authors')
for b in all_books_with_writers:
print(b.title, b.authors.all())
SELECT * FROM "library_book";
SELECT * FROM "library_writer"
INNER JOIN "library_book_authors"
ON ("library_writer"."id" = "library_book_authors"."writer_id")
WHERE "library_book_authors"."book_id" IN (2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
12, 13, 14, 15) ;
![Page 42: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/42.jpg)
Queries innecesarias
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 ')
![Page 43: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/43.jpg)
Procesamientos innecesarios● Traer datos que no son necesarios
Book.objects.all().select_related('genre').values('title', 'genre__name')
● Ordenar cosas si no es necesario
class Meta:
ordering = ['last_name']
SELECT * FROM "library_writer" ORDER BY "library_writer"."last_name" ASC
![Page 44: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/44.jpg)
Nos queda tiempo?
![Page 45: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1](https://reader034.fdocument.pub/reader034/viewer/2022042806/5f72a958c1e2083a942bb005/html5/thumbnails/45.jpg)
Preguntas?