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.

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.