Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

Explorando QuerySets do Django

Slide 3

Slide 3 text

@maribedran github.com gmail.com twitter.com

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

github.com/ maribedran/ talks/ tree/master/pyse2018

Slide 6

Slide 6 text

Conhecendo o Django

Slide 7

Slide 7 text

Documentação oficial docs.djangoproject.com Tutorial do Django Girls tutorial.djangogirls.org/pt/

Slide 8

Slide 8 text

Aprendendo SQL através do Django Para quem não conhece SQL a ORM pode ser uma ferramenta de aprendizagem. Leia as queries que estão sendo realizadas e experimente rodá-las direto no banco. A sintaxe do SQL é simples e intuitiva, em pouco tempo você aprende o básico. Observe a quantidade de queries sendo feitas e o tempo que elas demoram.

Slide 9

Slide 9 text

LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', # Loga no terminal }, }, 'loggers': { 'django': { 'handlers': ['console'], 'level': 'DEBUG', # Exibe todas as queries }, }, } Ative os logs em nível DEBUG nos settings para ver as queries no terminal e no shell do Django.

Slide 10

Slide 10 text

Instale o Django Debug Toolbar django-debug-toolbar.readthedocs.io DEBUG_TOOLBAR_CONFIG = { 'SHOW_TOOLBAR_CALLBACK': lambda x: True, } Para funcionar com o Rest Framework, adicione esta configuração aos settings.

Slide 11

Slide 11 text

Bancos de dados relacionais Em um banco relacional os dados são organizados em tabelas em que cada coluna define o nome e o tipo do campo que vai ser armazenado. As colunas que criam relações entre as tabelas são as chaves estrangeiras, onde uma entrada é uma referência a uma linha de outra tabela.

Slide 12

Slide 12 text

id nome empresa_id 1 Maria 4 2 João 2 Pessoa id nome 2 Empresa SA 4 Company Empresa

Slide 13

Slide 13 text

Models, Managers e QuerySets

Slide 14

Slide 14 text

O Modelo

Slide 15

Slide 15 text

Um modelo no django é uma classe que define uma tabela no banco de dados. Cada atributo do modelo representa uma coluna da tabela. O tipo de campo declarado determina o tipo da coluna.

Slide 16

Slide 16 text

Uma instância dessa classe representa uma entrada na tabela. Cada atributo na instância representa o valor da linha que ela representa para a respectiva coluna.

Slide 17

Slide 17 text

class Cinema(models.Model): nome = models.CharField(max_length=50) cidade = models.ForeignKey(Cidade) CREATE TABLE "cinema_cinema" ( "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "nome" varchar(50) NOT NULL, "cidade_id" integer NOT NULL REFERENCES "cinema_cidade" ("id") );

Slide 18

Slide 18 text

Uma instância do modelo representa apenas uma entrada individual no banco, portanto os métodos de instância deveriam realizar somente operações que afetam um objeto individual. - Properties que retornam atributos da entidade ou de objetos relacionados - Métodos que verificam estados e garantem sua integridade Responsabilidades

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

O Manager

Slide 21

Slide 21 text

Uma instância do modelo representa apenas uma entrada no banco. Para acessar e manipular conjuntos de dados o Django tem as classes de Managers.

Slide 22

Slide 22 text

Todo modelo no django tem implicitamante uma manager que é acessado pelo atributo objects, ele é responsável por fazer a interface entre o modelo e as operações no banco. Filme.objects.all() # Retorna todos os filmes

Slide 23

Slide 23 text

Podemos customizar o manager do nosso modelo criando uma classe que herde de models.Manager.

Slide 24

Slide 24 text

Criar, atualizar e remover entradas no banco. Responsabilidades

Slide 25

Slide 25 text

O QuerySet

Slide 26

Slide 26 text

O QuerySet do modelo é uma classe que herda de models.QuerySet e pode ser customizada da mesma forma que se faz com o manager. As tarefas de consulta no banco realizadas pelos managers são chamadas ao QuerySet do modelo. Um objeto QuerySet é um iterável e seus elementos são instâncias do modelo ou objetos python simples.

Slide 27

Slide 27 text

Os métodos de consulta no banco que usamos do atributo objects, como all e filter, retornam chamadas de métodos com o mesmo nome do QuerySet.

Slide 28

Slide 28 text

Realizar consultas no banco abstraindo os detalhes de implementação para o resto da aplicação. Responsabilidades

Slide 29

Slide 29 text

As entidades da nossa aplicação

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

Os métodos de Managers e QuerySets

Slide 34

Slide 34 text

Métodos que retornam instâncias do modelo

Slide 35

Slide 35 text

- get(id=10, nome='Maria') SELECT ... FROM ... table WHERE ... ; - first() SELECT ... FROM ... table ORDER BY ... ASC LIMIT 1; - last() SELECT ... FROM ... table ORDER BY .. DESC LIMIT 1; - earliest('nome') SELECT ... FROM ... table ORDER BY ... ASC LIMIT 1; - latest('nome') SELECT ... FROM ... table ORDER BY .. DESC LIMIT 1;

Slide 36

Slide 36 text

Atenção! get levanta a exceção models.MultipleObjectsReturned se encontrar mais de uma entrada e models.DoesNotExist se não encontrar nenhuma. Os demais retornam None se não houver entradas correspondentes.

Slide 37

Slide 37 text

Métodos que criam, atualizam e deletam

Slide 38

Slide 38 text

- create(nome='Maria') INSERT INTO table (...) VALUES (...); - update(nome='Maria') UPDATE table SET = , ...; - get_or_create(nome='Maria') SELECT ... FROM ... table WHERE ... ; ??? INSERT INTO table (...) VALUES (...);

Slide 39

Slide 39 text

- update_or_create(defaults={'idade': 30}, nome='Maria') SELECT ... FROM ... table WHERE ...; ??? UPDATE table SET = , ... WHERE ...; ??? INSERT INTO table (...) VALUES (...); - bulk_create([Pessoa(nome='Maria'), Pessoa(nome='João')]) INSERT INTO table () SELECT ... UNION ALL SELECT ...; - delete() DELETE FROM table WHERE ...;

Slide 40

Slide 40 text

Métodos que retornam QuerySets

Slide 41

Slide 41 text

- all() SELECT ... FROM ... table - none() não acessa o banco - filter(nome='Maria') SELECT ... FROM table WHERE ... - exclude(nome='Maria') SELECT ... FROM table WHERE NOT ... - distinct() SELECT DISTINCT ... FROM ... table

Slide 42

Slide 42 text

- order_by('nome') SELECT ... FROM ... table ORDER BY ... - order_by('nome').reverse() ou order_by('-nome') SELECT ... FROM ... table ORDER BY DESC ...

Slide 43

Slide 43 text

- values('nome') SELECT ... FROM table ● Seleciona todos se não receber argumentos ● Retorna um QuerySet com dicts - values_list('nome') SELECT ... FROM table ● Retorna um QuerySet com tuplas de valores - only('nome') SELECT ... FROM table - defer('nome') SELECT ... FROM table

Slide 44

Slide 44 text

- select_related('filme') SELECT ... FROM table; INNER JOIN table2 ON table.table2_id = table2.id; - prefetch_related('ingressos') SELECT ... FROM table; SELECT ... FROM table2 WHERE table2.table_id IN …;

Slide 45

Slide 45 text

Todos os métodos que retornam QuerySets podem ter chamadas encadeadas e a execução deles é lazzy. É possível chamar vários métodos que fazem queries diferentes, mas que só serão executadas uma vez.

Slide 46

Slide 46 text

Métodos que realizam consultas no banco e não retornam QuerySets

Slide 47

Slide 47 text

- iterator() SELECT ... FROM table; ● Retorna um objeto gerador ● Só realiza a query quando o primeiro elemento é acessado - exists() SELECT (1) AS "a" FROM table LIMIT 1; ● Retorna um booleano

Slide 48

Slide 48 text

- count() SELECT COUNT(*) AS "__count" FROM table; ● Retorna um inteiro - aggregate(expression) SELECT AS FROM table; ● Retorna um dict com o valor da expressão

Slide 49

Slide 49 text

Customizando Querysets

Slide 50

Slide 50 text

Criando uma classe de QuerySet customizada, podemos criar métodos especiais para fazer consultas que podem ser reaproveitadas em diversos lugares do código.

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

Usando QuerySets de forma eficiente no projeto

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

No content

Slide 57

Slide 57 text

www.labcodes.com.br github.com/labcodes twitter.com/labcodes speakerdeck.com/labcodes github.com/maribedran/talks/ That's all folks! [email protected]