Slide 1

Slide 1 text

Django ORM muito além de GET e FILTER

Slide 2

Slide 2 text

$whoami André Machado Software Engineer and Djangonaut at www.crowdbotics.com Recifense comedor de tapioca e cuscuz, em Indaiatuba Sofreu um bocado pra fazer data migration no South + Django 1.6

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Introdução ao ORM O que significa ORM? ORM - Object Relational Mapping - Visa aproveitar ao máximo o conceito de Orientação a Objetos, o Mapeamento Objeto-Relacional (ORM) é um framework que tem por objetivo minimizar as diferenças entre o paradigma orientado a objetos e o modelo entidade-relacional, criando uma ponte (mapeamento) entre o modelo relacional e o modelo orientado a objetos. O que é uma QuerySet? Uma QuerySet como o nome diz, é basicamente uma coleção de queries em SQL realizada pelo Django ORM para consultar o banco de dados. Uma QuerySet é "preguiçosa" (lazy) por definição, isso significa que a pesquisa não é feita imediatamente, apenas quando solicitado pela aplicação. Uma QS pode ser construída, filtrada, fatiada e movida entre lugares do código sem tocar na base. Nenhuma atividade no BD é realizada até que você utilize a QS de fato.

Slide 5

Slide 5 text

Os métodos ALL(), GET() e FILTER() Os métodos a seguir, são alguns dos métodos mais comuns do Django pois representam consultas/ações corriqueiras num banco de dados. GET - Consulta o banco utilizando um conjunto de dados. Se nenhum dado com o atributo informado é encontrado, retorna um ModelDoesNotExist Error, o que ocasiona a quebra do fluxo de execução da aplicação (Exception). Equivalente a um “SELECT * from WHERE = ” FILTER - Consulta o banco utilizando um conjunto de dados referentes ao modelo consultado. Ao contrário do GET, retorna um conjunto de resultados vazios e não quebra o fluxo de execução. ALL - Retorna todos os registros de um dado modelo. (SELECT * FROM )

Slide 6

Slide 6 text

GET_OR_CREATE(), UPDATE_OR_CREATE(), BULK_CREATE() GET_OR_CREATE - Cria ou retorna um registro no/do banco utilizando um conjunto de dados. Retorna o registro salvo como uma instação da classe do modelo referenciado juntamente com um booleano dizendo se foi criado (created) ou atualizado. UPDATE_OR_CREATE(default, kwargs) - Atualiza ou cria um registro no banco de dados usando os atributos passados no dict default na chamada do método, se nenhum registro for encontrado, cria e retorna utilizando o mesmo default dict (aceita callables) BULK_CREATE - Cria em massa uma lista de instâncias do modelo ao mesmo tempo, economizando recursos e evitando gargalos IO.

Slide 7

Slide 7 text

ORDER_BY(), LAST(), FIRST(), EARLIEST(), LATEST() ORDER_BY - Ordena os registros baseado no campo informado. Ordena DESCENDENTE caso seja passado um índice negativo (“-created_date”) LAST - Retorna o último registro da pilha ordenado de acordo com o campo passado na chamada, se nenhum campo for passado, ordena por ID. FIRST - Retorna o primeiro registro EARLIEST e LATEST funciona exatamente como FIRST e LAST, porém, levantam um erro de DoesNotExist caso nenhum registro seja encontrado.

Slide 8

Slide 8 text

ORDER_BY(), LAST(), FIRST(), EARLIEST(), LATEST() ORDER_BY - Ordena os registros baseado no campo informado. Ordena DESCENDENTE caso seja passado um índice negativo (“-created_date”) LAST - Retorna o último registro da pilha ordenado de acordo com o campo passado na chamada, se nenhum campo for passado, ordena por ID. FIRST - Retorna o primeiro registro EARLIEST e LATEST funciona exatamente como FIRST e LAST, porém, levantam um erro de DoesNotExist caso nenhum registro seja encontrado.

Slide 9

Slide 9 text

VALUES(), VALUES_LIST(), DISTINCT() VALUES- Retorna um dicionário com os valores dos registros selecionados utilizando filter(). Se usado sem filter, funciona como ALL. VALUES_LIST - Funciona como VALUES, porém retorna uma lista de tuplas com os valores, aceita o parâmetro FLAT opcionalmente, neste caso retorna uma lista de valores. Não possível utilizar FLAT para retorno com mais de um valor. Aceita NAMED também, neste caso retorna uma NAMEDTUPLE. DISTINCT - Elimina valores duplicados de uma consulta. Normalmente esses não ocorrem em uma consulta com ALL(), mas caso você esteja agregando valores ou realizando JOINS estes podem ocorrer, então é bom usar o distinct neste caso.

Slide 10

Slide 10 text

SELECT_RELATED(), PREFETCH_RELATED() SELECT_RELATED - Retorna uma QS que também vai trazer os valores das relações FK do modelo para evitar ações de IO adicionais quando referenciar a chave estrangeira. Resulta em consultas mais performáticas. Também possível referenciar relações em em cascata utilizando DUNDER notation (__) PREFETCH_RELATED - Funciona exatamente como o SELECT_RELATED mas, para relações Many2Many e Generic fields OBS: Qualquer operação DDL subsequente a um select/prefetch não utilizará o cache o que causara a limpeza do cache pré estabelecido bem como qualquer método encadeado após o cache inicial.

Slide 11

Slide 11 text

EXCLUDE(), DEFER(), ONLY() EXCLUDE - Filtra os resultados e ignora os registros que combinem com os argumentos passados para o método. DEFER - Ignora os campos especificados na transação e retorna os valores dos outros da tabela. Você pode fazer chamadas encadeadas usando defer e ir adicionando os campos ao retorno. ONLY - Funciona mais ou menos como DEFER. Retorna o valor dos campos que não devem ser ignorados.

Slide 12

Slide 12 text

UNION(), INTERSECTION(), DIFFERENCE() UNION - Retorna um conjunto de dados em união de 1 ou mais QSs. Retorna valores distintos por padrão, para valores duplicados, utilize all=True INTERSECTION - Retorna os valores compartilhados entre as QSs informadas. DIFFERENCE - Retorna os elementos existentes em uma QS que não estão nas outras QSs (qs1.difference(qs2, qs3...)

Slide 13

Slide 13 text

AGGREGATE(), ANNOTATE() AGGREGATE - Realiza funções de agregação contra o resultado de uma queryset. Aceita expressões para agregações mais complexas. ANNOTATE - Nomeia os resultados realizados pelo Aggregate e retorna um conjunto de objetos.

Slide 14

Slide 14 text

Ferramentas relacionadas a Querysets Q() - Funções Q servem como condicionais para queryset. Não é possivel usar OU em uma queryset sem o metodo Q() - ~Q() nega a expressão utilizada - Q() | funciona como OR dentro de uma queryset - Q () & funciona como AND Além de metodos condicionais, voce pode compor querysets utilizando Q()

Slide 15

Slide 15 text

Ferramentas relacionadas a Querysets

Slide 16

Slide 16 text

Ferramentas relacionadas a Querysets Objetos F() - Objetos F representam um valor de um modelo ou uma tabela anotada. Objetos F realizam operações sem “pegar” o valor do banco de verdade.

Slide 17

Slide 17 text

Mais informações e exemplos avançados https://docs.djangoproject.com/en/2.1/ref/models/ https://docs.djangoproject.com/en/2.1/topics/db/queries/ https://docs.djangoproject.com/pt-br/2.1/ref/models/querysets/

Slide 18

Slide 18 text

É ISSO, OBRIGADO!