English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Introdução Rápida Django-Modelo de banco de dados

Introdução Rápida Django-Tutorial detalhado do modelo de banco de dados

A primeira parte dessa série de tutoriais já foi concluída. Com base no último tutorial, neste capítulo, vamos criar um banco de dados, criar o primeiro modelo e usar um site de administração gerado rapidamente pelo Django.

Configuração do banco de dados

Agora, abra mysite/settings.py. O módulo de configuração do Django define variáveis de nível de módulo da mesma forma que os módulos Python normais.

Pelo padrão, a configuração usa SQLite. Se você é iniciante em bancos de dados ou quer tentar aprender Django, esta é a opção mais simples. SQLite está incluído no Python, então não é necessário instalar nada para suportar seu banco de dados. Quando você começar seu primeiro projeto real, pode precisar usar um banco de dados mais poderoso como PostgreSQL, MySQL, etc., e pode configurar a troca de banco de dados.

Se você quiser usar outro banco de dados, instale o adaptador de banco de dados correspondente e altere as seguintes chaves na configuração padrão do banco de dados para ajustar suas configurações de conexão de banco de dados:

MOTOR – Digite 'django.db.backends.sqlite'3', 'django.db.backends.postgresql', 'django.db.backends.mysql', ou 'django.db.backends.oracle' NOME – Nome do banco de dados. Se usar SQLite, o banco de dados será criado em seu computador; neste caso, o nome deve ser o caminho completo e absoluto do arquivo, incluindo o nome do arquivo. O valor padrão é os.path.join(BASE_DIR, "db.sqlite")3)

Se você não usar SQLite como banco de dados, e usar outras configurações, como USER, PASSWORD e HOST, devem ser adicionadas. Para obter mais detalhes, consulte Documentação de referência do banco de dados.

Quando você editar mysite/settings.py, configuração de fuso horário TIME_ZONE.

Além disso, note que no início do arquivo a configuração INSTALLED_APPS. Ele contém muitos nomes de aplicativos Django ativados neste exemplo Django. Os aplicativos podem ser usados em vários projetos, você pode empacotá-los e distribuí-los para outros projetos.

Pelo padrão, INSTALLED_APPS contém os seguintes aplicativos, todos eles usam Django:

django.contrib.admin – Administração do site, aqui será usado rapidamente django.contrib.auth – Sistema de autenticação django.contrib.contenttypes – Uma estrutura, tipo de conteúdo django.contrib.sessions – Uma framework de sessão django.contrib.messages – Uma framework de mensagens django.contrib.staticfiles – Uma framework para gerenciar arquivos estáticos

Esses aplicativos incluem o padrão, como um exemplo comum e conveniente.

Alguns dos aplicativos usam pelo menos uma tabela de banco de dados, então precisamos criar as tabelas no banco de dados para que possam ser usadas. Para fazer isso, execute o seguinte comando:

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
C:\Python27\mysite>python manage.py migrate
 Operações a serem executadas:
   Aplicar todas as migrações: admin, contenttypes, auth, sessions
 Executando migrações:
   Renderizando estados do modelo... CONCLUÍDO
   Aplicando contenttypes.0001_initial... OK
   Aplicando auth.0001_initial... OK
   Aplicando admin.0001_initial... OK
   Aplicando admin.0002_logentry_remove_auto_add... OK
   Aplicando contenttypes.0002_remove_content_type_name... OK
   Aplicando auth.0002_alter_permission_name_max_length... OK
   Aplicando auth.0003_alter_user_email_max_length... OK
   Aplicando auth.0004_alter_user_username_opts... OK
   Aplicando auth.0005_alter_user_last_login_null... OK
   Aplicando auth.0006_require_contenttypes_0002... OK
   Aplicando auth.0007_alter_validators_add_error_messages... OK
   Aplicando sessions.0001_initial... OK
 C:\Python27\mysite>

O comando migrate foca nas configurações INSTALLED_APPS e cria com base no seu mysite/Configurações do arquivo settings.py, migrando qualquer tabela de banco de dados do aplicativo (discutiremos isso em tutoriais futuros). Você verá mensagens aplicáveis para移植. Se interessado, execute o comando na linha de comando do seu cliente de banco de dados, por exemplo, tipo \dt (PostgreSQL), SHOW TABLES; (MySQL), .schema (SQLite) ou SELECT TABLE_NAME FROM USER_TABLES; (Oracle) para exibir as tabelas criadas pelo Django.

Criar modelo

Agora, vamos definir o modelo - Fundamentalmente, o banco de dados é projetado usando outros metadados.

Em nossa aplicação de pesquisa simples, criaremos dois modelos: Question e Choice. Question tem um título de questão e data de publicação. Choice tem dois campos: texto de escolha e número de votos. Cada opção está associada a uma questão.

esses conceitos são representados por classes Python simples. Editar polls/models.py, então  polls/models.py parece assim:


 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
import datetime
 from django.utils import timezone
     question_text = models.CharField(max_length=200)
     pub_date = models.DateTimeField('date published')
 class Choice(models.Model):
     question = models.ForeignKey(Question, on_delete=models.CASCADE)
     choice_text = models.CharField(max_length=200)
     votes = models.IntegerField(default=0)

O código é direto. Cada modelo é uma subclasse da classe django.db.models.Model. Cada modelo possui muitas variáveis de classe, cada uma associada a um campo da tabela do banco de dados.

Cada campo é representado por uma instância da classe Field – por exemplo, CharField representa campos de caractere, DateTimeField representa campos de data e hora. Isso informa ao Django o tipo de dados armazenados em cada campo.

O nome de cada instância de Field (por exemplo, question_text ou pub_date) é o nome do campo, que é um formato amigável para a máquina. Ao usar este valor no código Python, o banco de dados usará ele como nome da coluna.

Os campos também podem ter parâmetros opcionais diferentes; neste exemplo, já configuramos o valor padrão de votos para 0.

Por fim, é importante notar a definição das relações, aqui usamos chaves estrangeiras. Isso informa ao Django que cada opção está associada a uma questão. O Django suporta todas as relações de banco de dados comuns: um para muitos, muitos para muitos e um para um.

ativar o modelo

O código do modelo é pequeno, mas representa muitas informações do Django. Com ele, o Django pode:

Crie um banco de dados para este aplicativo (comando CREATE TABLE)

Crie um API de acesso ao banco de dados Python para os objetos Question e Choice

Mas antes disso, precisamos informar o item polls sobre os aplicativos instalados.

Edite novamente o arquivo mysite/O arquivo settings.py, e altere a configuração INSTALLED_APPS para incluir a string 'polls.apps.PollsConfig'. O resultado será o seguinte:

mysite/O conteúdo do arquivo settings.py é o seguinte:

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
Agora o Django sabe sobre o aplicativo de votação polls. Vamos executar outro comando:
# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
C:\Python27\mysite>python manage.py makemigrations polls
 Migrações para 'polls':
   0001_initial.py:
     - Criar modelo Choice
     - Criar modelo Question
     - Adicionar campo question para choice
 C:\Python27\mysite>

Ao executar makemigrations, você informa ao Django que fez algumas alterações nas modelagens (no caso, elas já estão atualizadas) e deseja armazenar essas alterações como uma migração.

As migrações mostram como o Django armazena suas alterações nas modelagens (decidido pela arquitetura do seu banco de dados).- Eles são apenas arquivos no disco. Se você quiser, pode ler a nova modelagem de migração, que está no arquivo polls/migrations/0001_initial.py. Você não deseja que o Django leia esses arquivos a cada vez, mas eles são projetados para serem editáveis, então você sabe como o Django muda e ajusta manualmente.

Existem também comandos para executar migrations, que gerenciam automaticamente o esquema do banco de dados (tabelas). - Isso é o que chamamos de migração, vamos ver como o SQL é executado. O comando sqlmigrate retorna o nome da migração para o SQL:


 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
$ python manage.py sqlmigrate polls 0001

Deve ver algo semelhante ao seguinte (já reformateamos sua legibilidade):

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
C:\Python27\mysite>python manage.py sqlmigrate polls 0001
 BEGIN;
 --
 -- Criar modelo Choice
 --
 CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "c
 hoice_text" varchar(200) NOT NULL, "votes" integer NOT NULL);
 --
 -- Criar modelo Question
 --
 CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
 "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
 --
 -- Adicionar campo question para choice
 --
 ALTER TABLE "polls_choice" RENAME TO "polls_choice__old";
 CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "c
 hoice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" integer
 er NOT NULL REFERENCES "polls_question" ("id"));
 INSERT INTO "polls_choice" ("choice_text", "votes", "id", "question_id") SELECT
 "choice_text", "votes", "id", NULL FROM "polls_choice__old";
 DROP TABLE "polls_choice__old";
 CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id");
 COMMIT;
 C:\Python27\mysite>

O comando de migração executará todas as migrações ainda não aplicadas (o Django rastrea quais foram aplicadas usando uma tabela especial no banco de dados chamada django_migrations) e as executará no banco de dados. - Basicamente, usaremos modelos para sincronizar as mudanças no esquema do banco de dados.

Usar API

Agora, vamos entrar no shell interativo do Python e na API fornecida pelo Django. Para chamar o comando de linha do Python, use o seguinte comando:

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
C:\Python27C:\Python\mysite>python manage.py shell
 Python 2.7.10 (padrão, maio 23 2015, 09:44) [MSC v.1500 64 bit (AMD64)] no wi
 n32
 Digite "help", "copyright", "credits" ou "license" para mais informações.
 (Console Interativo)
 >>>

Basta digitar "python" para substituir, porque o manage.py configura a variável de ambiente DJANGO_SETTINGS_MODULE, o que dá ao Django o caminho de importação para mysite./arquivo settings.py.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
>>> import django
 >>> django.setup()
# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
>>> from polls.models import Question, Choice # importe as classes de modelo que escrevemos recentemente.
 # Ainda não há perguntas no sistema.
 >>> Question.objects.all()
 []
 # Crie uma nova Question.
 # O suporte para fuso horário está ativado no arquivo de configurações padrão, então
 # Django espera um datetime com tzinfo para pub_date. Use timezone.now().
 # em vez de datetime.datetime.now() e ele fará a coisa certa.
 >>> from django.utils import timezone
 >>> q = Question(question_text="O que há de novo?", pub_date=timezone.now())
 # Salve o objeto no banco de dados. Você deve chamar save() explicitamente.
 >>> q.save()
 # Agora ele tem um ID. Note que isso pode dizer "1instead of "1depending
 # no qual você está usando. Isso não é grande coisa; apenas significa que sua
 # o backend do banco de dados prefere retornar inteiros como Python long integer
 # objects.
 >>> q.id
 1
 # Acesse os valores do campo do modelo via atributos Python.
 >>> q.question_text
 "What's new?"
 >>> q.pub_date
 datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
 # Altere os valores alterando os atributos, então chamando save().
 >>> q.question_text = "What's up?"
 >>> q.save()
 # objects.all() exibe todas as perguntas no banco de dados.
 >>> Question.objects.all()
 [<Question: Question object>]

Aqui é necessário esperar um pouco. <Question: Question object> é uma representação inútil deste objeto. Vamos resolver isso: editando o modelo Question (no diretório polls/models.py arquivo), e adicione um método __str__() aos dois modelos Question e Choice:

polls/O conteúdo do arquivo models.py é o seguinte:
 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
import datetime
 from django.utils.encoding import python_2_unicode_compatible
 @python_2_unicode_compatible # apenas se precisar suportar Python 2
 from django.utils import timezone
     class Question(models.Model):
     def __str__(self):
         return self.question_text
 @python_2_unicode_compatible # apenas se precisar suportar Python 2
 class Choice(models.Model):
     class Question(models.Model):
     def __str__(self):
         return self.choice_text

Adicionar o método __str__() é muito importante, usar prompts interativos para lidar com a adição ao modelo, não só facilita para você mesmo, mas também porque a representação do objeto é usada por todo o Django para gerar automaticamente a gestão.

注意,这些都是正常的Python方法。让我们添加一个自定义的方法,这里只是为了演示:polls/注意,这些都是正常的Python方法。Vamos adicionar um método personalizado, aqui apenas para demonstração: polls

 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
models.py
 import datetime
 from django.db import models
 from django.utils import timezone
     class Question(models.Model):
     # ...
         def foi_publicado_recentemente(self): - return self.pub_date >= timezone.now()1)

Atenção, aqui foi adicionado import datetime e from django.utils import timezone, referenciando o módulo padrão datetime do Python e os utilitários de fuso horário do Django em django.utils.timezone. Se não estiver familiarizado com o tratamento de fusos horários no Python, pode ler  Documentação de suporte a fuso horário.

Salve essas alterações e execute novamente python manage.py shell para iniciar um novo shell de interação Python:

 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
>>> from polls.models import Question, Choice
 # Certifique-se de que a adição de __str__() funcionou.
 >>> Question.objects.all()
 [<Pergunta: O que está a acontecer?>]
 # Django fornece uma API de busca de banco de dados rica que é completamente conduzida por
 # Argumentos de palavras-chave.
 >>> Question.objects.filter(id=1)
 [<Pergunta: O que está a acontecer?>]
 >>> Question.objects.filter(question_text__startswith='What')
 [<Pergunta: O que está a acontecer?>]
 # Obter a pergunta publicada neste ano.
 >>> from django.utils import timezone
 >>> current_year = timezone.now().year
 >>> Question.objects.get(pub_date__year=current_year)
 <Pergunta: O que está a acontecer?>
 # Solicite um ID que não existe, isso levantará uma exceção.
 >>> Question.objects.get(id=2)
 Traceback (última chamada mais recente):
     ...
 DoesNotExist: Pergunta correspondente à consulta não existe.
 # Procurar por uma chave primária é o caso mais comum, então Django fornece um
 # atalho para primário-busca exata por chave.
 # O seguinte é idêntico a Question.objects.get(id=1)
 >>> Question.objects.get(pk=1)
 <Pergunta: O que está a acontecer?>
 # Certifique-se de que nosso método personalizado funcionou.
 >>> q = Question.objects.get(pk=1)
 >>> q.was_published_recently()
 True
 # Forneça alguns Escolhas para a Pergunta. A chamada create constrói um novo
 # objeto Choice, faz a declaração INSERT, adiciona a escolha ao conjunto
 # do número de escolhas disponíveis e retorna o novo objeto Choice. Django cria
 # Um conjunto para conter o "lado outro" de uma relação ForeignKey
 # (por exemplo, uma escolha de uma pergunta) que pode ser acessada via a API.
 >>> q = Question.objects.get(pk=1)
 # Mostrar qualquer escolha do conjunto relacionado -- Nenhum até agora.
 >>> q.choice_set.all()
 []
 # Crie três opções.
 >>> q.choice_set.create(choice_text='não muito', votes=0)
 <Opção: não muito>
 >>> q.choice_set.create(choice_text='O céu', votes=0)
 <Opção: O céu>
 >>> c = q.choice_set.create(choice_text='Apenas hackeando novamente', votes=0)
 # Objetos Opção têm acesso à API para seus objetos Pergunta relacionados.
 >>> c.question
 <Pergunta: O que está a acontecer?>
 # e vice-versa: Objetos Pergunta obtêm acesso aos objetos Opção.
 >>> q.choice_set.all()
 [<Opção: não muito>, <Opção: O céu>, <Opção: Apenas hackeando novamente>]
 >>> q.choice_set.count()
 3
 # A API segue automaticamente as relações tanto quanto você precisar.
 # Use sublinhados duplos para separar relações.
 # Isso funciona em qualquer profundidade que você quiser; não há limite.
 # Encontre todas as Opções para qualquer pergunta cujo pub_date seja neste ano
 # (reutilizando a variável 'current_year' que criamos acima).
 >>> Choice.objects.filter(question__pub_date__year=current_year)
 [<Opção: não muito>, <Opção: O céu>, <Opção: Apenas hackeando novamente>]
 # Apague uma das opções. Use delete() para isso.
 >>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
 >>> c.delete()

Introdução ao Django Management

Crie um usuário administrador

Primeiro, precisamos criar um usuário que possa fazer login na interface de administração. Execute o seguinte comando:

 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08c:\python27\mysite> python manage.py createsuperuser

Insira o nome de usuário que você deseja (qualquer um), e pressione Enter.

 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
Username: admin

Então, será solicitado que você insira o endereço de e-mail (qualquer um):

 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
Endereço de e-mail: [email protected]

O último passo é inserir a senha. Ele exigirá que você insira a senha duas vezes, a segunda para confirmar a primeira.

 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
Password: **********
 Password (again): *********
 Superuser created successfully.

Inicie o servidor de desenvolvimento

O site de administração do Django está ativado por padrão. Vamos iniciar o servidor de desenvolvimento e explorá-lo.

Se o servidor não estiver em execução, inicie-o conforme abaixo:

 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
c:\python27\mysite>python manage.py runserver

Agora, abra o navegador da web, acesse “/admin/” domínio local- Por exemplo,   http://127.0.0.1:8000/admin/  Você deve ver a interface de login do administrador:  

Devido ao padrão de login habilitado, a tela de login pode ser exibida no seu próprio idioma, devido ao padrão de tradução habilitado, a tela de login pode ser exibida no seu próprio idioma,

Insira o site do administrador

Agora, tente fazer login com a conta de usuário superusuário criada no passo anterior. Você deve ver a página inicial de administração do Django:  

Você deve ver alguns conteúdos editáveis: grupos e usuários. Eles são fornecidos pelo django.contrib.auth, a framework de autenticação do Django.

Modifique o programa de administração polls

Onde está o aplicativo polls? Ele não será exibido na página de índice de administração.

Há apenas uma coisa a fazer: precisamos informar ao administrador que o objeto Question possui uma interface de administração. Para fazer isso, abra o aplicativo polls/modifique o arquivo admin.py conforme abaixo:  

 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : pt.oldtoolbag.com
# Date : 2020-08-08
from django.contrib import admin
 from models import Question
 admin.site.register(Question)

Navegue nas funcionalidades de administração

Agora, já registramos o Question, o Django sabe que deve ser exibido na página inicial de administração:

Clique em “Perguntas”. Agora, na página “lista de mudanças”, veja as perguntas. Esta página mostra todas as perguntas no banco de dados e permite que você selecione uma delas para alterar. Além disso, a pergunta que criamos anteriormente:

Clique na pergunta “O que há de novo?” para editar:

Os pontos a serem observados estão listados aqui:

 

Os formulários são gerados automaticamente a partir do modelo (Question).

 

Os tipos de campos diferentes (DateTimeField, CharField) correspondem aos componentes de entrada HTML correspondentes. Cada tipo de campo sabe como se mostrar no Django Management.

Cada campo DateTimeField recebe um atalho rápido JavaScript. A data recebe um atalho rápido “Hoje” e abre um calendário, e várias vezes recebe o atalho rápido “Agora” e abre uma janela que lista os horários de entrada comuns.

Modifique “Data Publicada” clique nos atalhos rápidos “Hoje” e “Agora”. Em seguida, clique em “Salvar e Continuar Editando”. Em seguida, clique em “Histórico” no canto superior direito. Você verá uma página que lista todas as mudanças feitas pelo Django para este objeto, nome de usuário do modificador e timestamp:   Download de Código:  http://pan.baidu.com/s/1jGR3wDg