Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Django ORM - Além do GET e FILTER

Django ORM - Além do GET e FILTER

Vamos ver metodos menos visto para quem começou a utilizar o ORM do Django ou para aqueles que não sabiam que existiam.

Avatar for Andre Machado

Andre Machado

March 30, 2019
Tweet

More Decks by Andre Machado

Other Decks in Programming

Transcript

  1. $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
  2. 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.
  3. 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 <model> WHERE <attr> = <value>” 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 <model>)
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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 (<fk>__<fk2>) 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.
  9. 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.
  10. 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...)
  11. 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.
  12. 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()
  13. 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.