Django ORM

Resumo : neste tutorial, você aprenderá sobre Django ORM e como usar a API Django ORM para interagir com bancos de dados relacionais.

Introdução ao Django ORM

ORM significa mapeamento objeto-relacional. ORM é uma técnica que permite manipular dados em um banco de dados relacional usando programação orientada a objetos.

Django ORM permite que você use a mesma API Python para interagir com vários bancos de dados relacionais, incluindo PostgreSQL, MySQL, Oracle e SQLite. Veja uma lista completa de bancos de dados suportados aqui .

Django ORM usa o padrão de registro ativo :

  • Uma classe é mapeada para uma única tabela no banco de dados. A classe geralmente é chamada de classe modelo.
  • Um objeto da classe é mapeado para uma única linha da tabela.

Depois de definir uma classe de modelo, você poderá acessar métodos predefinidos para criar, ler, atualizar e excluir dados.

Além disso, o Django gera automaticamente um site de administração para gerenciar os dados dos modelos. Vamos dar uma olhada em um exemplo simples para ver como funciona o Django ORM.

Configurando um projeto base

Montaremos um projeto base com um novo ambiente virtual.

Criando um novo ambiente virtual

Primeiro, crie um novo ambiente virtual usando o módulo integrado venv:

python -m venv venvLinguagem de código:  Python  ( python )

Segundo, ative o ambiente virtual:

venv\scripts\activateLinguagem de código:  Python  ( python )

Terceiro, instale o pacote django& django-extensions:

pip install django django-extensionsLinguagem de código:  Python  ( python )

O django-extensionspacote fornece algumas extensões personalizadas para o framework Django. Usaremos django-extensionspackage para gerar o SQL gerado pelo Django ORM.

Criando um novo projeto

Primeiro, crie um novo projeto Django chamado django_orm:

django-admin startproject django_ormLinguagem de código:  Python  ( python )

Segundo, crie um HRaplicativo dentro do django_ormprojeto:

cd django_orm
python manage.py startapp hrLinguagem de código:  Python  ( python )

Terceiro, registre ambos hre django_extensionsno INSTALLED_APPSdo settings.pyprojeto:

INSTALLED_APPS = [
    # ...
    'django_extensions',
    'hr',
]
Linguagem de código:  Python  ( python )

Configurando o servidor de banco de dados PostgreSQL

Primeiro, instale um servidor de banco de dados PostgreSQL em seu computador local .

Segundo, faça login no servidor de banco de dados PostgreSQL. Ele solicitará a senha do postgresusuário. Observe que você usa a mesma senha digitada para o postgresusuário durante a instalação.

psql -U postgres
Password for user postgres:Linguagem de código:  Python  ( python )

Terceiro, crie um novo banco de dados com o nome hre tipo exitpara sair do psqlprograma:

postgres=# create database hr;
CREATE DATABASE
postgres=# exitLinguagem de código:  Python  ( python )

Conectando-se ao PostgreSQL do Django

Primeiro, configure a conexão com o banco de dados no settings.pyprojeto django_orm:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'hr',
        'USER': 'postgres',
        'PASSWORD': 'POSTGRES_PASSWORD',
        'HOST': 'localhost',
        'PORT': '',
    }
}Linguagem de código:  Python  ( python )

Observe que você altera a POSTGRES_PASSWORDsua senha.

Segundo, instale o psycopg2pacote para permitir que o Django se conecte ao PostgreSQLservidor de banco de dados:

pip install psycopg2Linguagem de código:  Python  ( python )

Terceiro, execute o servidor de desenvolvimento Django:

python manage.py runserverLinguagem de código:  Python  ( python )

Você verá a página inicial padrão do Django:

Página inicial do Django ORM

Definindo um modelo

Primeiro, defina uma Employeeclasse no hraplicativo que tenha dois campos first_namee last_name:

from django.db import models


class Employee(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    def __str__(self):
        return f'{self.first_name} {self.last_name}'Linguagem de código:  Python  ( python )

Segundo, faça migrações usando o makemigrationscomando:

python manage.py makemigrationsLinguagem de código:  Python  ( python )

Saída:

Migrations for 'hr':
  hr\migrations\0001_initial.py
    - Create model EmployeeLinguagem de código:  Python  ( python )

Terceiro, propague as alterações no banco de dados usando o migratecomando:

python manage.py migrateLinguagem de código:  Python  ( python )

O Django cria muitas tabelas, incluindo aquelas para os modelos integrados, como Usere Group. Neste tutorial, vamos nos concentrar na Employeeclasse.

Com base na Employeeclasse model, Django ORM cria uma tabela hr_employeeno banco de dados:

Exemplo de Django ORM

Django combina o nome do aplicativo e o nome da classe para gerar o nome da tabela:

app_modelclassLinguagem de código:  Python  ( python )

Neste exemplo, o nome do aplicativo é hre o nome da classe é Employee. Portanto, o Django cria a tabela com o nome hr_employee. Observe que o Django converte o nome da classe em letras minúsculas antes de anexá-lo ao nome do aplicativo.

A Employeeclasse do modelo possui dois campos first_namee last_name. Como a classe Employee herda da models.Modelclasse, o Django adiciona automaticamente o campo id como um campo de incremento automático chamado id. Portanto, a hr_employeetabela possui três colunas id, first_name, e last_name.

Para interagir com a hr_employeetabela, você pode executar o shell_pluscomando que vem do django-extensionspacote.

Observe que o Django fornece um comando integrado shell. No entanto, o shell_pluscomando é mais conveniente de trabalhar. Por exemplo, carrega automaticamente os modelos definidos no projeto e exibe o SQL gerado.

Execute o shell_pluscomando com a --print-sqlopção:

python manage.py shell_plus --print-sqlLinguagem de código:  Python  ( python )

Inserindo dados

Primeiro, crie um novo Employeeobjeto e chame o save()método para inserir uma nova linha na tabela:

>>> e = Employee(first_name='John',last_name='Doe')
>>> e.save()
INSERT INTO "hr_employee" ("first_name", "last_name")
VALUES ('John', 'Doe') RETURNING "hr_employee"."id"
Execution time: 0.003234s [Database: default]Linguagem de código:  Python  ( python )

Neste exemplo, você não precisa definir o valor da coluna id. O banco de dados gera automaticamente seu valor e o Django irá defini-lo assim que você inserir uma nova linha na tabela.

Conforme mostrado na saída, o Django usa a INSERTinstrução para inserir uma nova linha com duas colunas first_namena last_nametabela hr_employee.

Segundo, insira o segundo funcionário com o nome Janee sobrenome Doe:

>>> e = Employee(first_name='Jane',last_name='Doe')
>>> e.save()
INSERT INTO "hr_employee" ("first_name", "last_name")
VALUES ('Jane', 'Doe') RETURNING "hr_employee"."id"
Execution time: 0.002195s [Database: default]Linguagem de código:  Python  ( python )

Agora, a hr_employeetabela tem duas linhas com id 1 e 2.

Selecionando dados

Para selecionar todas as linhas da hr_employeestabela, você usa o all()método como este:

>>> Employee.objects.all()
SELECT "hr_employee"."id",
       "hr_employee"."first_name",
       "hr_employee"."last_name"
  FROM "hr_employee"
 LIMIT 21
Execution time: 0.001856s [Database: default]
<QuerySet [<Employee: John Doe>, <Employee: Jane Doe>]>Linguagem de código:  Python  ( python )

Como funciona.

  • Primeiro, o Django usa a SELECTinstrução para selecionar linhas da hr_employeetabela.
  • Segundo, o Django converte linhas em Employeeobjetos e retorna um QuerySetque contém os Employeeobjetos.

Observe que LIMITfoi adicionado pelo Django para retornar 21 registros para exibição no shell.

Para selecionar uma única linha por ID, você pode usar o get()método. Por exemplo, o seguinte retorna o funcionário com id 1:

>>> e = Employee.objects.get(id=1)
SELECT "hr_employee"."id",
       "hr_employee"."first_name",
       "hr_employee"."last_name"
  FROM "hr_employee"
 WHERE "hr_employee"."id" = 1
 LIMIT 21
Execution time: 0.001003s [Database: default]
>>> e
<Employee: John Doe>Linguagem de código:  Python  ( python )

Ao contrário do all()método, o get()método retorna um Employeeobjeto em vez de um arquivo QuerySet.

Para localizar funcionários pelo primeiro nome, você pode usar o filter()método do QuerySetobjeto. Por exemplo, o seguinte encontra funcionários com o primeiro nome Jane:

>>> Employee.objects.filter(first_name='Jane')
SELECT "hr_employee"."id",
       "hr_employee"."first_name",
       "hr_employee"."last_name"
  FROM "hr_employee"
 WHERE "hr_employee"."first_name" = 'Jane'
 LIMIT 21
Execution time: 0.000000s [Database: default]
<QuerySet [<Employee: Jane Doe>]>Linguagem de código:  Python  ( python )

Atualizando dados

Primeiro, selecione o funcionário com id 2:

>>> e = Employee.objects.get(id=2)
SELECT "hr_employee"."id",
       "hr_employee"."first_name",
       "hr_employee"."last_name"
  FROM "hr_employee"
 WHERE "hr_employee"."id" = 2
 LIMIT 21
Execution time: 0.001022s [Database: default]Linguagem de código:  Python  ( python )

Segundo, atualize o sobrenome do funcionário selecionado para Smith:

>>> e.last_name = 'Smith'
>>> e.save()
UPDATE "hr_employee"
   SET "first_name" = 'Jane',
       "last_name" = 'Smith'
 WHERE "hr_employee"."id" = 2
Execution time: 0.004019s [Database: default]
>>> e
<Employee: Jane Smith>Linguagem de código:  Python  ( python )

Excluindo dados

Para excluir uma instância de um modelo, você usa o delete()método. O exemplo a seguir exclui o funcionário com id 2:

>>> e.delete()
DELETE
  FROM "hr_employee"
 WHERE "hr_employee"."id" IN (2)
Execution time: 0.002001s [Database: default]
(1, {'hr.Employee': 1})Linguagem de código:  Python  ( python )

Para excluir todas as instâncias de um modelo, use o all()método para selecionar todos os funcionários e chame o delete()método para excluir todos os funcionários selecionados:

>>> Employee.objects.all().delete()
DELETE
  FROM "hr_employee"
Execution time: 0.001076s [Database: default]
(1, {'hr.Employee': 1})Linguagem de código:  Python  ( python )

Django usa a DELETEinstrução sem WHEREcláusula para excluir todas as linhas da hr_employeetabela.

Baixe o Django ORM aqui.

Resumo

  • Django ORM permite interagir com bancos de dados relacionais usando API Python.
  • Django ORM usa o padrão de registro ativo, no qual uma classe é mapeada para uma tabela e um objeto mapeado para uma linha.
  • Use all()o método para obter todas as linhas de uma tabela.
  • Use get()o método para selecionar uma linha por id.
  • Use filter()o método para filtrar linhas por um ou mais campos.
  • Use save()o método para criar uma nova linha ou atualizar uma linha existente.
  • Use delete()o método para excluir uma ou mais linhas de uma tabela.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *