{"title":"Escrevendo sua primeira aplicação Django, parte 2","version":"5.0","locale":"pt-br","docname":"intro/tutorial02","url":"/pt-br/5.0/intro/tutorial02/","canonical":"https://djangodocs.dev/pt-br/5.0/intro/tutorial02/","summary":"Este tutorial inicia onde Tutorial 1 1 termina. Configuraremos uma base de dados, criaremos seu primeiro model e obteremos uma rápida introdução ao site de…","html":"<h1>Escrevendo sua primeira aplicação Django, parte 2<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-2\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Este tutorial inicia onde <span class=\"xref std std-doc\">Tutorial 1 1</span> termina. Configuraremos uma base de dados, criaremos seu primeiro model e obteremos uma rápida introdução ao site de administração do Django.</p>\n<aside class=\"admonition-where-to-get-help admonition\">\n<p class=\"admonition-title\">Onde obter ajuda:</p>\n<p>Se tiver problemas enquanto caminha por este tutorial, por favor consulte a seção <a class=\"reference internal\" href=\"/pt-br/5.0/faq/help/\"><span class=\"doc\">Obtendo ajuda</span></a> da FAQ.</p>\n</aside>\n<section id=\"database-setup\">\n<h2>Configuração do banco de dados<a class=\"heading-anchor\" href=\"#database-setup\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Agora, abra o <code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code>. Ele é um módulo normal do Python com variáveis de módulo representando as configurações do Django.</p>\n<p>Por padrão, a configuração usa o SQLite. Se você é novo com banco de dados, ou se estiver somente interessado em experimentar o Django, esta á maneira mais simples. SQLite está incluso no Python, de modo que você não precisa instalar nada a mais para ter o banco de dados. Contudo, quando iniciar seu primeiro projeto real, talvez queira usar um banco de dados mais escalável como o PostgreSQL, para evitar problemas com a troca do banco de dados no caminho.</p>\n<p>Se você quiser usar outro banco de dados, instale as <a class=\"reference internal\" href=\"/pt-br/5.0/topics/install/#database-installation\"><span class=\"std std-ref\">ligações de banco de dados</span></a> apropriadas e altere os seguintes parâmetros no item <a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> <code class=\"docutils literal notranslate\"><span class=\"pre\">'default'</span></code> para corresponder às suas configurações de conexão de banco de dados:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-DATABASE-ENGINE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ENGINE</span></code></a> – ou mesmo  <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.db.backends.sqlite3'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.db.backends.postgresql'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.db.backends.mysql'</span></code>, ou <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.db.backends.oracle'</span></code>. Outros backends estão <a class=\"reference internal\" href=\"/pt-br/5.0/ref/databases/#third-party-notes\"><span class=\"std std-ref\">estão disponíveis</span></a>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> – O nome do seu banco de dados, se você estiver usando SQLite, o banco de dados será uma arquivo no seu computador; neste caso, <a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> deve ser o caminho absoluto, incluindo o nome, para este arquivo. O valor padrão <code class=\"docutils literal notranslate\"><span class=\"pre\">BASE_DIR</span> <span class=\"pre\">/</span> <span class=\"pre\">'db.sqlite3'</span></code>, ira criar este arquivo no diretório do seu projeto.</p></li>\n</ul>\n<p>Caso não use o SQLite como banco de dados, configurações adicionais como <a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USER</span></code></a>, <a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-PASSWORD\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PASSWORD</span></code></a>, e <a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">HOST</span></code></a> deverão ser adicionadas. Para mais detalhes, veja a referência na documentação para <a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>.</p>\n<aside class=\"admonition-for-databases-other-than-sqlite admonition\">\n<p class=\"admonition-title\">Para bancos de dados que não o SQLite</p>\n<p>Caso use um banco de dados que não seja o SQLite, tenha certeza que o banco de dados foi criado até este ponto. Faça isso com “<code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">DATABASE</span> <span class=\"pre\">database_name;</span></code>” dentro do prompt interativo do seu banco de dados.</p>\n<p>Também se certifique que o “database user” indicado em <code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code> tenha a permissão  “create database”. Isso permite a criação automática de  <a class=\"reference internal\" href=\"/pt-br/5.0/topics/testing/overview/#the-test-database\"><span class=\"std std-ref\">test database</span></a> o qual será necessário e um tutorial mais adiante.</p>\n<p>Se você está utilizando SQLite você não precisa criar nada de antemão - o arquivo do banco de dados será criado automaticamente quando ele for necessário.</p>\n</aside>\n<p>Enquanto estiver editando <code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code>, mude <a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIME_ZONE</span></code></a> para o seu fuso horário.</p>\n<p>Também observe a configuração do\n<a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> na parte superior do arquivo. Ela possui os nomes de todas as aplicações Django ativas para essa instância do Django. Aplicações podem ser usadas em múltiplos projetos, e você pode empacotá-las e distribuí-las para uso por outros em seus projetos.</p>\n<p>Por padrão, o <a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> contém as seguintes aplicações, que vêm com o Django:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/pt-br/5.0/ref/contrib/admin/#module-django.contrib.admin\" title=\"django.contrib.admin: Django's admin site.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.admin</span></code></a> – O site de administração. Irá usar isso em breve.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/5.0/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.auth</span></code></a> – Um sistema de autenticação.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/5.0/ref/contrib/contenttypes/#module-django.contrib.contenttypes\" title=\"django.contrib.contenttypes: Provides generic interface to installed models.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.contenttypes</span></code></a> – Um framework para tipos de conteúdo.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/5.0/topics/http/sessions/#module-django.contrib.sessions\" title=\"django.contrib.sessions: Provides session management for Django projects.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.sessions</span></code></a> – Um framework de sessão.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/5.0/ref/contrib/messages/#module-django.contrib.messages\" title=\"django.contrib.messages: Provides cookie- and session-based temporary message storage.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.messages</span></code></a> – Um framework de envio de mensagem.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/5.0/ref/contrib/staticfiles/#module-django.contrib.staticfiles\" title=\"django.contrib.staticfiles: An app for handling static files.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.staticfiles</span></code></a> – Um framework para gerenciamento de arquivos estáticos.</p></li>\n</ul>\n<p>Estas aplicações são incluídas por padrão como uma conveniência para o caso comum.</p>\n<p>Algumas dessas aplicações fazem uso de pelo menos uma tabela no banco de dados, assim sendo, nós precisamos criar as tabelas no banco de dados antes que possamos\nutilizá-las. Para isso rode o seguinte comando:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>migrate\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py migrate\n</code></pre></div></div></div>\n<p>The <a class=\"reference internal\" href=\"/pt-br/5.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> command looks at the <a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> setting\nand creates any necessary database tables according to the database settings\nin your <code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code> file and the database migrations shipped\nwith the app (we’ll cover those later). You’ll see a message for each\nmigration it applies. If you’re interested, run the command-line client for your\ndatabase and type <code class=\"docutils literal notranslate\"><span class=\"pre\">\\dt</span></code> (PostgreSQL), <code class=\"docutils literal notranslate\"><span class=\"pre\">SHOW</span> <span class=\"pre\">TABLES;</span></code> (MariaDB, MySQL),\n<code class=\"docutils literal notranslate\"><span class=\"pre\">.tables</span></code> (SQLite), or <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">TABLE_NAME</span> <span class=\"pre\">FROM</span> <span class=\"pre\">USER_TABLES;</span></code> (Oracle) to\ndisplay the tables Django created.</p>\n<aside class=\"admonition-for-the-minimalists admonition\">\n<p class=\"admonition-title\">Para os minimalistas</p>\n<p>Como dissemos acima, as aplicações padrão são incluídas para casos comuns, mas nem todo mundo precisa delas. Se você não precisa de nenhuma delas, sinta-se livre para comentar ou deletar a(s) linha(s) apropriada(s) do   <a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> antes de rodar o <a class=\"reference internal\" href=\"/pt-br/5.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a>. O comando <a class=\"reference internal\" href=\"/pt-br/5.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> irá executar as migrações apenas para as aplicações que estiverem no <a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>.</p>\n</aside>\n</section>\n<section id=\"creating-models\">\n<span id=\"id1\"></span><h2>Criando modelos<a class=\"heading-anchor\" href=\"#creating-models\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Agora vamos definir seus modelos – essencialmente, o layout do banco de dados, com metadados adicionais.</p>\n<aside class=\"admonition-philosophy admonition\">\n<p class=\"admonition-title\">Filosofia</p>\n<p>A model is the single, definitive source of information about your data. It\ncontains the essential fields and behaviors of the data you’re storing.\nDjango follows the <a class=\"reference internal\" href=\"/pt-br/5.0/misc/design-philosophies/#dry\"><span class=\"std std-ref\">DRY Principle</span></a>. The goal is to define your\ndata model in one place and automatically derive things from it.</p>\n<p>Isso inclui as migrações - ao contrário de Ruby on Rails, por exemplo, as migrações são inteiramente derivada de seu arquivo de modelos, e são essencialmente apenas uma história que o Django pode avançar para atualizar o esquema de banco de dados para coincidir com seus modelos atuais.</p>\n</aside>\n<p>Em nossa aplicação de enquete, nós iremos criar dois modelos: <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code>. Uma <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> tem uma pergunta e uma data de publicação. Uma <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code>  tem dois campos: o texto da escolha e um totalizador de votos. Cada <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code> é associada a uma <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>.</p>\n<p>Esses conceitos são representados por simples classes Python. Edite o arquivo <code class=\"file docutils literal notranslate\"><span class=\"pre\">polls/models.py</span></code> de modo que fique assim:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/models.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Question</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">question_text</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    <span class=\"n\">pub_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateTimeField</span><span class=\"p\">(</span><span class=\"s2\">&quot;date published&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Choice</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">question</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Question</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"n\">choice_text</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    <span class=\"n\">votes</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">(</span><span class=\"n\">default</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Aqui, cada modelo é representado por uma classe derivada da classe <a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.db.models.Model</span></code></a>. Cada modelo possui alguns atributos de classe, as quais por sua vez representa um campo do banco de dados no modelo.</p>\n<p>Cada campo é representado por uma instância de uma classe <a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> – por exemplo, <a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a> para campos do tipo caractere e <a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a> para data/hora. Isto diz ao Django qual tipo de dado cada campo contém.</p>\n<p>O nome de cada instância <a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> (por exemplo <code class=\"docutils literal notranslate\"><span class=\"pre\">question_text</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code>) é o nome do campo, em formato amigável para a máquina. Você irá usar este valor no seu código Python, e seu banco de dados irá usá-lo como nome de coluna.</p>\n<p>Você pode usar um argumento opcional na primeira posição de um <a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> para designar um nome legível para seres humanos o qual será usado em uma série de partes introspectivas do Django, e também servirá como documentação. Se esse argumento não for fornecido, o Django utilizará o nome legível para máquina. Neste exemplo nós definimos um nome legível para humanos apenas para <code class=\"docutils literal notranslate\"><span class=\"pre\">Question.pub_date</span></code>. Para todos os outros campos neste modelo, o nome legível para máquina será utilizado como nome legível para humanos.</p>\n<p>Algumas classes de <a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> possuem elementos obrigatórios.  O <a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a>, por exemplo, requer que você informe a ele um <code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">max_length</span></code> que é usado não apenas no esquema do banco de dados, mas na validação, como nós veremos em breve.</p>\n<p>Um <a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> pode ter vários argumentos opcionais; neste caso, definimos o valor <a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/fields/#django.db.models.Field.default\" title=\"django.db.models.Field.default\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">default</span></code></a> de <code class=\"docutils literal notranslate\"><span class=\"pre\">votes</span></code> para 0.</p>\n<p>Finalmente, note que uma relação foi criada, usando <a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a>. Isso diz ao Django que cada <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code> está relacionada a uma única <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>. O Django oferece suporte para todos os relacionamentos comuns de um banco de dados: muitos-para-um, muitos-para-muitos e um-para-um.</p>\n</section>\n<section id=\"activating-models\">\n<h2>Ativando modelos<a class=\"heading-anchor\" href=\"#activating-models\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Aquela pequena parte do modelo fornece ao Django muita informação. Com ela o Django é capaz de:</p>\n<ul class=\"simple\">\n<li><p>Criar um esquema de banco de dados (instruções <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TABLE</span></code>) para a aplicação.</p></li>\n<li><p>Criar uma API de acesso a banco de dados para acessar objetos <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code>.</p></li>\n</ul>\n<p>Mas primeiro nós precisamos dizer ao nosso projeto que a aplicação <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> está instalada.</p>\n<aside class=\"admonition-philosophy admonition\">\n<p class=\"admonition-title\">Filosofia</p>\n<p>Aplicações Django são “plugáveis”: Você pode usar uma aplicação em múltiplos projetos, e você pode distribuir aplicações, porque elas não precisam ser atreladas a uma determinada instalação do Django.</p>\n</aside>\n<p>Para incluir a aplicação no nosso projeto, precisamos adicionar a referência à classe de configuração da aplicação na configuração <a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> . A classe <code class=\"docutils literal notranslate\"><span class=\"pre\">PollsConfig</span></code> está no arquivo <code class=\"file docutils literal notranslate\"><span class=\"pre\">polls/apps.py</span></code>, então seu caminho pontuado é <code class=\"docutils literal notranslate\"><span class=\"pre\">'polls.apps.PollsConfig'</span></code>. Edite o arquivo <code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code> e adicione aquele caminho com notação de ponto a configuração <a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>. Ficará parecido como aqui:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">INSTALLED_APPS</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;polls.apps.PollsConfig&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.admin&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.auth&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.contenttypes&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.sessions&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.messages&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.staticfiles&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>Agora o Django sabe que deve incluir a aplicação <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>. Vamos rodar outro comando:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-1-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>makemigrations<span class=\"w\"> </span>polls\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-1-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py makemigrations polls\n</code></pre></div></div></div>\n<p>Você deverá ver algo similar ao seguinte:</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>Migrations for &#39;polls&#39;:\n  polls/migrations/0001_initial.py\n    - Create model Question\n    - Create model Choice\n</code></pre></div>\n<p>Ao executar <code class=\"docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code>, você está dizendo ao Django que você fez algumas mudanças em seus modelos (neste caso, você fez novas modificações) e que você gostaria que as alterações sejam armazenadas como uma <em>migração</em>.</p>\n<p>As migrações são como o Django armazena as alterações nos seus modelos (e, portanto, seu esquema de banco de dados) - eles são apenas arquivos no disco. Você pode ler a migração para seu novo modelo, se quiser; é o arquivo <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/migrations/0001_initial.py</span></code>. Não se preocupe, você não precisa lê-los cada vez que o Django cria um, mas eles são projetados para serem editados no caso de você precisar ajustar manualmente como Django muda as coisas.</p>\n<p>Existe um comando que vai rodar as migrações para você e gerenciar o esquema do banco de dados automaticamente -  que é chamado <a class=\"reference internal\" href=\"/pt-br/5.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a>, e nós vamos chegar a ele em um momento - mas primeiro vamos ver qual SQL está migração vai rodar. O comando <a class=\"reference internal\" href=\"/pt-br/5.0/ref/django-admin/#django-admin-sqlmigrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">sqlmigrate</span></code></a> recebe o nome da migração e o seu SQL.</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-2-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>sqlmigrate<span class=\"w\"> </span>polls<span class=\"w\"> </span><span class=\"m\">0001</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-2-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py sqlmigrate polls 0001\n</code></pre></div></div></div>\n<p>Você deve ver algo semelhante ao seguinte (reformatamos para facilitar a leitura):</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">BEGIN</span><span class=\"p\">;</span>\n<span class=\"c1\">--</span>\n<span class=\"c1\">-- Create model Question</span>\n<span class=\"c1\">--</span>\n<span class=\"k\">CREATE</span><span class=\"w\"> </span><span class=\"k\">TABLE</span><span class=\"w\"> </span><span class=\"ss\">&quot;polls_question&quot;</span><span class=\"w\"> </span><span class=\"p\">(</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;id&quot;</span><span class=\"w\"> </span><span class=\"nb\">bigint</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"w\"> </span><span class=\"k\">PRIMARY</span><span class=\"w\"> </span><span class=\"k\">KEY</span><span class=\"w\"> </span><span class=\"k\">GENERATED</span><span class=\"w\"> </span><span class=\"k\">BY</span><span class=\"w\"> </span><span class=\"k\">DEFAULT</span><span class=\"w\"> </span><span class=\"k\">AS</span><span class=\"w\"> </span><span class=\"k\">IDENTITY</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;question_text&quot;</span><span class=\"w\"> </span><span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">200</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;pub_date&quot;</span><span class=\"w\"> </span><span class=\"k\">timestamp</span><span class=\"w\"> </span><span class=\"k\">with</span><span class=\"w\"> </span><span class=\"k\">time</span><span class=\"w\"> </span><span class=\"k\">zone</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span>\n<span class=\"p\">);</span>\n<span class=\"c1\">--</span>\n<span class=\"c1\">-- Create model Choice</span>\n<span class=\"c1\">--</span>\n<span class=\"k\">CREATE</span><span class=\"w\"> </span><span class=\"k\">TABLE</span><span class=\"w\"> </span><span class=\"ss\">&quot;polls_choice&quot;</span><span class=\"w\"> </span><span class=\"p\">(</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;id&quot;</span><span class=\"w\"> </span><span class=\"nb\">bigint</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"w\"> </span><span class=\"k\">PRIMARY</span><span class=\"w\"> </span><span class=\"k\">KEY</span><span class=\"w\"> </span><span class=\"k\">GENERATED</span><span class=\"w\"> </span><span class=\"k\">BY</span><span class=\"w\"> </span><span class=\"k\">DEFAULT</span><span class=\"w\"> </span><span class=\"k\">AS</span><span class=\"w\"> </span><span class=\"k\">IDENTITY</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;choice_text&quot;</span><span class=\"w\"> </span><span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">200</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;votes&quot;</span><span class=\"w\"> </span><span class=\"nb\">integer</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;question_id&quot;</span><span class=\"w\"> </span><span class=\"nb\">bigint</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span>\n<span class=\"p\">);</span>\n<span class=\"k\">ALTER</span><span class=\"w\"> </span><span class=\"k\">TABLE</span><span class=\"w\"> </span><span class=\"ss\">&quot;polls_choice&quot;</span>\n<span class=\"w\">  </span><span class=\"k\">ADD</span><span class=\"w\"> </span><span class=\"k\">CONSTRAINT</span><span class=\"w\"> </span><span class=\"ss\">&quot;polls_choice_question_id_c5b4b260_fk_polls_question_id&quot;</span>\n<span class=\"w\">    </span><span class=\"k\">FOREIGN</span><span class=\"w\"> </span><span class=\"k\">KEY</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"ss\">&quot;question_id&quot;</span><span class=\"p\">)</span>\n<span class=\"w\">    </span><span class=\"k\">REFERENCES</span><span class=\"w\"> </span><span class=\"ss\">&quot;polls_question&quot;</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"ss\">&quot;id&quot;</span><span class=\"p\">)</span>\n<span class=\"w\">    </span><span class=\"k\">DEFERRABLE</span><span class=\"w\"> </span><span class=\"k\">INITIALLY</span><span class=\"w\"> </span><span class=\"k\">DEFERRED</span><span class=\"p\">;</span>\n<span class=\"k\">CREATE</span><span class=\"w\"> </span><span class=\"k\">INDEX</span><span class=\"w\"> </span><span class=\"ss\">&quot;polls_choice_question_id_c5b4b260&quot;</span><span class=\"w\"> </span><span class=\"k\">ON</span><span class=\"w\"> </span><span class=\"ss\">&quot;polls_choice&quot;</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"ss\">&quot;question_id&quot;</span><span class=\"p\">);</span>\n\n<span class=\"k\">COMMIT</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>Note o seguinte:</p>\n<ul class=\"simple\">\n<li><p>A saída exata irá variar dependendo do banco de dados que você está utilizando.</p></li>\n<li><p>Os nomes das tabelas são gerados automaticamente combinando o nome da aplicação (<code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>) e o nome em minúsculas do modelo – <code class=\"docutils literal notranslate\"><span class=\"pre\">question</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">choice</span></code>. (Você pode alterar esse comportamento.)</p></li>\n<li><p>Chaves primárias (IDs) são adicionadas automaticamente. (Você também pode modificar isso.)</p></li>\n<li><p>Por convenção, o Django adiciona <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;_id&quot;</span></code> ao nome do campo de uma chave estrangeira. (Sim, você pode alterar isso, como quiser.)</p></li>\n<li><p>The foreign key relationship is made explicit by a <code class=\"docutils literal notranslate\"><span class=\"pre\">FOREIGN</span> <span class=\"pre\">KEY</span></code>\nconstraint. Don’t worry about the <code class=\"docutils literal notranslate\"><span class=\"pre\">DEFERRABLE</span></code> parts; it’s telling\nPostgreSQL to not enforce the foreign key until the end of the transaction.</p></li>\n<li><p>It’s tailored to the database you’re using, so database-specific field types\nsuch as <code class=\"docutils literal notranslate\"><span class=\"pre\">auto_increment</span></code> (MySQL), <code class=\"docutils literal notranslate\"><span class=\"pre\">bigint</span> <span class=\"pre\">PRIMARY</span> <span class=\"pre\">KEY</span> <span class=\"pre\">GENERATED</span> <span class=\"pre\">BY</span> <span class=\"pre\">DEFAULT</span>\n<span class=\"pre\">AS</span> <span class=\"pre\">IDENTITY</span></code> (PostgreSQL), or <code class=\"docutils literal notranslate\"><span class=\"pre\">integer</span> <span class=\"pre\">primary</span> <span class=\"pre\">key</span> <span class=\"pre\">autoincrement</span></code> (SQLite)\nare handled for you automatically. Same goes for the quoting of field names\n– e.g., using double quotes or single quotes.</p></li>\n<li><p>The <a class=\"reference internal\" href=\"/pt-br/5.0/ref/django-admin/#django-admin-sqlmigrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">sqlmigrate</span></code></a> command doesn’t actually run the migration on your\ndatabase - instead, it prints it to the screen so that you can see what SQL\nDjango thinks is required. It’s useful for checking what Django is going to\ndo or if you have database administrators who require SQL scripts for\nchanges.</p></li>\n</ul>\n<p>Se você tiver interesse, você pode rodar <a class=\"reference internal\" href=\"/pt-br/5.0/ref/django-admin/#django-admin-check\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">manage.py</span> <span class=\"pre\">check</span></code></a>; Ele checa por problemas no seu projeto sem criar migrations ou tocar seu banco de dados.</p>\n<p>Agora rode o <a class=\"reference internal\" href=\"/pt-br/5.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> novamente para criar essas tabelas dos modelos no seu banco de dados:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-3-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>migrate\n<span class=\"go\">Operations to perform:</span>\n<span class=\"go\">  Apply all migrations: admin, auth, contenttypes, polls, sessions</span>\n<span class=\"go\">Running migrations:</span>\n<span class=\"go\">  Rendering model states... DONE</span>\n<span class=\"go\">  Applying polls.0001_initial... OK</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-3-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py migrate\n<span class=\"go\">Operations to perform:</span>\n<span class=\"go\">  Apply all migrations: admin, auth, contenttypes, polls, sessions</span>\n<span class=\"go\">Running migrations:</span>\n<span class=\"go\">  Rendering model states... DONE</span>\n<span class=\"go\">  Applying polls.0001_initial... OK</span>\n</code></pre></div></div></div>\n<p>O comando <a class=\"reference internal\" href=\"/pt-br/5.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> pega todas as migrações que ainda não foram aplicadas (Django rastreia quais foram aplicadas usando uma tabela especial em seu banco de dados chamada <code class=\"docutils literal notranslate\"><span class=\"pre\">django_migrations</span></code>) e aplica elas no seu banco de dados - essencialmente, sincronizando as alterações feitas aos seus modelos com o esquema no banco de dados.</p>\n<p>Migrações são muito poderosas e permitem que você altere seus modelos ao longo do tempo, à medida que desenvolve o seu projeto, sem a necessidade de remover o seu banco de dados ou tabelas e criar de novo - ele é especializado em atualizar seu banco de dados ao vivo, sem perda de dados. Nós vamos cobri-los com mais profundidade em uma parte posterior do tutorial, mas para agora, lembre-se deste guia de três passos para fazer mudanças nos seus modelos:</p>\n<ul class=\"simple\">\n<li><p>Mude seus modelos (em <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code>).</p></li>\n<li><p>Rode <a class=\"reference internal\" href=\"/pt-br/5.0/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">manage.py</span> <span class=\"pre\">makemigrations</span></code></a> para criar migrações para suas modificações</p></li>\n<li><p>Rode <a class=\"reference internal\" href=\"/pt-br/5.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">manage.py</span> <span class=\"pre\">migrate</span></code></a> para aplicar suas modificações no banco de dados.</p></li>\n</ul>\n<p>The reason that there are separate commands to make and apply migrations is\nbecause you’ll commit migrations to your version control system and ship them\nwith your app; they not only make your development easier, they’re also\nusable by other developers and in production.</p>\n<p>Leia a <a class=\"reference internal\" href=\"/pt-br/5.0/ref/django-admin/\"><span class=\"doc\">documentação do django-admin</span></a> para informações completas sobre o que o utilitário <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></code> pode fazer.</p>\n</section>\n<section id=\"playing-with-the-api\">\n<h2>Brincando com a API<a class=\"heading-anchor\" href=\"#playing-with-the-api\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Agora vamos dar uma passada no shell interativo do Python e brincar um pouco com a API livre que o Django dá a você. Para invocar o shell do Python, use esse comando:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-4-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>shell\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-4-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py shell\n</code></pre></div></div></div>\n<p>We’re using this instead of simply typing “python”, because <code class=\"file docutils literal notranslate\"><span class=\"pre\">manage.py</span></code>\nsets the <span class=\"target\" id=\"index-0\"></span><a class=\"reference internal\" href=\"/pt-br/5.0/topics/settings/#envvar-DJANGO_SETTINGS_MODULE\"><code class=\"xref std std-envvar docutils literal notranslate\"><span class=\"pre\">DJANGO_SETTINGS_MODULE</span></code></a> environment variable, which gives\nDjango the Python import path to your <code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code> file.</p>\n<p>Once you’re in the shell, explore the <a class=\"reference internal\" href=\"/pt-br/5.0/topics/db/queries/\"><span class=\"doc\">database API</span></a>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">polls.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Choice</span><span class=\"p\">,</span> <span class=\"n\">Question</span>  <span class=\"c1\"># Import the model classes we just wrote.</span>\n\n<span class=\"go\"># No questions are in the system yet.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n\n<span class=\"go\"># Create a new Question.</span>\n<span class=\"go\"># Support for time zones is enabled in the default settings file, so</span>\n<span class=\"go\"># Django expects a datetime with tzinfo for pub_date. Use timezone.now()</span>\n<span class=\"go\"># instead of datetime.datetime.now() and it will do the right thing.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">timezone</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">Question</span><span class=\"p\">(</span><span class=\"n\">question_text</span><span class=\"o\">=</span><span class=\"s2\">&quot;What&#39;s new?&quot;</span><span class=\"p\">,</span> <span class=\"n\">pub_date</span><span class=\"o\">=</span><span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">())</span>\n\n<span class=\"go\"># Save the object into the database. You have to call save() explicitly.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"go\"># Now it has an ID.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">id</span>\n<span class=\"go\">1</span>\n\n<span class=\"go\"># Access model field values via Python attributes.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">question_text</span>\n<span class=\"go\">&quot;What&#39;s new?&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">pub_date</span>\n<span class=\"go\">datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc)</span>\n\n<span class=\"go\"># Change values by changing the attributes, then calling save().</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">question_text</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;What&#39;s up?&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"go\"># objects.all() displays all the questions in the database.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Question: Question object (1)&gt;]&gt;</span>\n</code></pre></div>\n<p>Espere um pouco. <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;Question:</span> <span class=\"pre\">Question</span> <span class=\"pre\">object</span> <span class=\"pre\">(1)&gt;</span></code> é uma representação totalmente inútil desse objeto. Vamos corrigir isso editando o modelo da <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> (no arquivo <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/models.py</span></code>) e adicionando um método <a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/instances/#django.db.models.Model.__str__\" title=\"django.db.models.Model.__str__\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__str__()</span></code></a> a ambos <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/models.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Question</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">question_text</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Choice</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">choice_text</span>\n</code></pre></figure>\n<p>É importante adicionar métodos <a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/instances/#django.db.models.Model.__str__\" title=\"django.db.models.Model.__str__\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__str__()</span></code></a> aos seus modelos, não apenas para sua própria conveniência quando estiver lidando com o prompt interativo, mas também porque representações de objetos são usadas por todo interface administrativa gerada automaticamente pelo Django.</p>\n<p id=\"tutorial02-import-timezone\">Vamos também adicionar um método personalizado a este modelo:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/models.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">timezone</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Question</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">was_published_recently</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pub_date</span> <span class=\"o\">&gt;=</span> <span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Note a adição de <code class=\"docutils literal notranslate\"><span class=\"pre\">import</span> <span class=\"pre\">datetime</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">from</span> <span class=\"pre\">django.utils</span> <span class=\"pre\">import</span> <span class=\"pre\">timezone</span></code>,  para referenciar o módulo padrão do Python <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#module-datetime\" title=\"(em Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">datetime</span></code></a> e o modulo Django utilitário de fuso horário <a class=\"reference internal\" href=\"/pt-br/5.0/ref/utils/#module-django.utils.timezone\" title=\"django.utils.timezone: Timezone support.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.utils.timezone</span></code></a>, respectivamente. Se você não é familiar com o gerenciamento de fuso horário no  Python, você pode aprender mais no <a class=\"reference internal\" href=\"/pt-br/5.0/topics/i18n/timezones/\"><span class=\"doc\">documentação de suporte a fuso horários</span></a>.</p>\n<p>Save these changes and start a new Python interactive shell by running\n<code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">manage.py</span> <span class=\"pre\">shell</span></code> again:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">polls.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Choice</span><span class=\"p\">,</span> <span class=\"n\">Question</span>\n\n<span class=\"go\"># Make sure our __str__() addition worked.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Question: What&#39;s up?&gt;]&gt;</span>\n\n<span class=\"go\"># Django provides a rich database lookup API that&#39;s entirely driven by</span>\n<span class=\"go\"># keyword arguments.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Question: What&#39;s up?&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">question_text__startswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;What&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Question: What&#39;s up?&gt;]&gt;</span>\n\n<span class=\"go\"># Get the question that was published this year.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">timezone</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">current_year</span> <span class=\"o\">=</span> <span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">year</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pub_date__year</span><span class=\"o\">=</span><span class=\"n\">current_year</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Question: What&#39;s up?&gt;</span>\n\n<span class=\"go\"># Request an ID that doesn&#39;t exist, this will raise an exception.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"w\">    </span><span class=\"o\">...</span>\n<span class=\"gr\">DoesNotExist</span>: <span class=\"n\">Question matching query does not exist.</span>\n\n<span class=\"x\"># Lookup by a primary key is the most common case, so Django provides a</span>\n<span class=\"x\"># shortcut for primary-key exact lookups.</span>\n<span class=\"x\"># The following is identical to Question.objects.get(id=1).</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Question: What&#39;s up?&gt;</span>\n\n<span class=\"go\"># Make sure our custom method worked.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">was_published_recently</span><span class=\"p\">()</span>\n<span class=\"go\">True</span>\n\n<span class=\"go\"># Give the Question a couple of Choices. The create call constructs a new</span>\n<span class=\"go\"># Choice object, does the INSERT statement, adds the choice to the set</span>\n<span class=\"go\"># of available choices and returns the new Choice object. Django creates</span>\n<span class=\"go\"># a set (defined as &quot;choice_set&quot;) to hold the &quot;other side&quot; of a ForeignKey</span>\n<span class=\"go\"># relation (e.g. a question&#39;s choice) which can be accessed via the API.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Display any choices from the related object set -- none so far.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">choice_set</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n\n<span class=\"go\"># Create three choices.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">choice_set</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">choice_text</span><span class=\"o\">=</span><span class=\"s2\">&quot;Not much&quot;</span><span class=\"p\">,</span> <span class=\"n\">votes</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Choice: Not much&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">choice_set</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">choice_text</span><span class=\"o\">=</span><span class=\"s2\">&quot;The sky&quot;</span><span class=\"p\">,</span> <span class=\"n\">votes</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Choice: The sky&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">choice_set</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">choice_text</span><span class=\"o\">=</span><span class=\"s2\">&quot;Just hacking again&quot;</span><span class=\"p\">,</span> <span class=\"n\">votes</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Choice objects have API access to their related Question objects.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">c</span><span class=\"o\">.</span><span class=\"n\">question</span>\n<span class=\"go\">&lt;Question: What&#39;s up?&gt;</span>\n\n<span class=\"go\"># And vice versa: Question objects get access to Choice objects.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">choice_set</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">choice_set</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">()</span>\n<span class=\"go\">3</span>\n\n<span class=\"go\"># The API automatically follows relationships as far as you need.</span>\n<span class=\"go\"># Use double underscores to separate relationships.</span>\n<span class=\"go\"># This works as many levels deep as you want; there&#39;s no limit.</span>\n<span class=\"go\"># Find all Choices for any question whose pub_date is in this year</span>\n<span class=\"go\"># (reusing the &#39;current_year&#39; variable we created above).</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Choice</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">question__pub_date__year</span><span class=\"o\">=</span><span class=\"n\">current_year</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]&gt;</span>\n\n<span class=\"go\"># Let&#39;s delete one of the choices. Use delete() for that.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">choice_set</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">choice_text__startswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;Just hacking&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">c</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Para mais informações sobre relacionamento de modelos, veja <a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/relations/\"><span class=\"doc\">Acessando objetos relacionados</span></a>. Para mais informação em como usar sublinhados duplos para pesquisa usando campos da API, veja <a class=\"reference internal\" href=\"/pt-br/5.0/topics/db/queries/#field-lookups-intro\"><span class=\"std std-ref\">Pesquisa com campos</span></a>. Para um detalhamento completo da API de banco de dados, veja nossa <a class=\"reference internal\" href=\"/pt-br/5.0/topics/db/queries/\"><span class=\"doc\">referência à API de Banco de Dados</span></a>.</p>\n</section>\n<section id=\"introducing-the-django-admin\">\n<h2>Escrevendo sua primeira aplicação Django, parte 7<a class=\"heading-anchor\" href=\"#introducing-the-django-admin\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"admonition-philosophy admonition\">\n<p class=\"admonition-title\">Filosofia</p>\n<p>Gerar um site de administração para sua equipe ou clientes para adicionar, alterar, e deletar conteúdo é uma tarefa tediosa que não requer muita criatividade. Por essa razão, o Django automatiza totalmente a criação da interface de administração para os modelos.</p>\n<p>O Django foi desenvolvido em um ambiente de redação, onde havia uma clara separação entre “produtores de conteúdo” e o site “público”. Gerentes de site usam o sistema para adicionar notícias, eventos, resultado de esportes, etc, e o conteúdo é exibido no site público. O Django soluciona o problema de criar uma interface unificada para os administradores editarem o conteúdo.</p>\n<p>A interface de administração não foi desenvolvida necessariamente para ser usada pelos visitantes do site, mas sim pelos gerentes.</p>\n</aside>\n<section id=\"creating-an-admin-user\">\n<h3>Criando um usuário administrador<a class=\"heading-anchor\" href=\"#creating-an-admin-user\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Primeiro temos que criar um usuário que possa acessar o site de administração. Execute o seguinte comando:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-5-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>createsuperuser\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-5-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py createsuperuser\n</code></pre></div></div></div>\n<p>Digite seu nome de usuário desejado e pressione enter.</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>Username: admin\n</code></pre></div>\n<p>Em seguida, será requisitado seu endereço de e-mail desejado:</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>Email address: admin@example.com\n</code></pre></div>\n<p>O último passo é digitar sua senha. Você será solicitado que digite sua senha duas vezes, a segunda vez como uma confirmação da primeira.</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>Password: **********\nPassword (again): *********\nSuperuser created successfully.\n</code></pre></div>\n</section>\n<section id=\"start-the-development-server\">\n<h3>Inicie o servidor de desenvolvimento<a class=\"heading-anchor\" href=\"#start-the-development-server\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>O site de administração vem ativado por padrão. Vamos iniciar o servidor de desenvolvimento e explorá-lo.</p>\n<p>Se o servidor não estiver sendo executado, inicie-o da seguinte forma:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-6-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>runserver\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-6-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py runserver\n</code></pre></div></div></div>\n<p>Now, open a web browser and go to “/admin/” on your local domain – e.g.,\n<a class=\"reference external\" href=\"http://127.0.0.1:8000/admin/\">http://127.0.0.1:8000/admin/</a>. You should see the admin’s login screen:</p>\n<img alt=\"Tela de login do Django admin\" src=\"/pt-br/5.0/_images/admin01.png\" />\n<p>Since <a class=\"reference internal\" href=\"/pt-br/5.0/topics/i18n/translation/\"><span class=\"doc\">translation</span></a> is turned on by default, if\nyou set <a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a>, the login screen will be displayed in the\ngiven language (if Django has appropriate translations).</p>\n</section>\n<section id=\"enter-the-admin-site\">\n<h3>Entre no site de administração<a class=\"heading-anchor\" href=\"#enter-the-admin-site\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Agora, tente acessar o sistema com a conta de super usuário que criou no passo anterior.  Você deverá ver a página inicial do site de administração do Django:</p>\n<img alt=\"Django admin index page\" src=\"/pt-br/5.0/_images/admin02.png\" />\n<p>Você deverá ver alguns outros tipos de conteúdos editáveis, incluindo grupos e usuários. Estas  funcionalidades são fornecidas por mod:django.contrib.auth, o framework de autenticação fornecido pelo Django.</p>\n</section>\n<section id=\"make-the-poll-app-modifiable-in-the-admin\">\n<h3>Torne a aplicação de enquetes editável no site de administração<a class=\"heading-anchor\" href=\"#make-the-poll-app-modifiable-in-the-admin\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Mas onde está nossa aplicação de enquete? Ela não está visível na página principal do site de administração.</p>\n<p>Only one more thing to do: we need to tell the admin that <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> objects\nhave an admin interface. To do this, open the <code class=\"file docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code> file, and\nedit it to look like this:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Question</span>\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">Question</span><span class=\"p\">)</span>\n</code></pre></figure>\n</section>\n<section id=\"explore-the-free-admin-functionality\">\n<h3>Explore a funcionalidade de administração de graça<a class=\"heading-anchor\" href=\"#explore-the-free-admin-functionality\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Agora que nós registramos <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>, o Django sabe que ela deve ser exibida na página principal do site de administração:</p>\n<img alt=\"Django admin index page, now with polls displayed\" src=\"/pt-br/5.0/_images/admin03t.png\" />\n<p>Clique em “Questions”. Agora cocê está na página “change list” para “questions”. Essa página mostra todas as “questions” em seu banco de dados e lhe deixa escolher uma para alterar. Lá está a pergunta “What’s up?” que criamos anteriormente.</p>\n<img alt=\"Polls change list page\" src=\"/pt-br/5.0/_images/admin04t.png\" />\n<p>Clique na enquete “What’s up?” para editá-la:</p>\n<img alt=\"Editing form for question object\" src=\"/pt-br/5.0/_images/admin05t.png\" />\n<p>Coisas para observar aqui:</p>\n<ul class=\"simple\">\n<li><p>O formulário é gerado automaticamente para o modelo <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>.</p></li>\n<li><p>Os diferentes tipos de campos (<a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a>, <a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a>) correspondem aos respectivos componentes HTML de inserção. Cada tipo de campo sabe como se exibir no site de administração do Django.</p></li>\n<li><p>Cada <a class=\"reference internal\" href=\"/pt-br/5.0/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a> ganha um atalho JavaScript de graça. Datas possuem um atalho “Hoje” e um calendário popup, e horas têm um atalho “Agora” e um conveniente popup com listas de horas utilizadas comumente.</p></li>\n</ul>\n<p>A parte inferior da página fornece uma série de opções:</p>\n<ul class=\"simple\">\n<li><p>Salvar – Salva as alterações e retorna para a pagina lista de modificação para este tipo de objeto.</p></li>\n<li><p>Salvar e continuar editando – Salva as alterações e recarrega a página do site de administração para este objeto.</p></li>\n<li><p>Salvar e adicionar outro – Salva as informações e abre um novo formulário em branco para este tipo de objeto.</p></li>\n<li><p>Deletar – Exibe uma página de confirmação de exclusão.</p></li>\n</ul>\n<p>Se o valor do “Date published” não bate com hora que a questão foi criada em <a class=\"reference internal\" href=\"/pt-br/5.0/intro/tutorial01/\"><span class=\"doc\">Tutorial 1</span></a>, provavelmente quer dizer que foi esquecido de configurar o correto valor da configuração do <a class=\"reference internal\" href=\"/pt-br/5.0/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIME_ZONE</span></code></a>. Altere isso, e recarregue a página e verifique se o calor correto aparece.</p>\n<p>Altere a “Data de publicação” clicando nos atalhos “Hoje” e “Agora”. Em seguida, clique em “Salvar e continuar editando.” Então clique em “Histórico” no canto superior direito. Você verá uma página exibindo todas as alterações feitas neste objeto pelo site de administração do Django, com a hora e o nome de usuário da pessoa que fez a alteração:</p>\n<img alt=\"History page for question object\" src=\"/pt-br/5.0/_images/admin06t.png\" />\n<p>Quando estiver confortável com a API dos modelos e estiver familiarizado com o site de administração, leia <a class=\"reference internal\" href=\"/pt-br/5.0/intro/tutorial03/\"><span class=\"doc\">parte 3 desse tutorial</span></a> para aprender sobre como adicionar mais “views” para nossa aplicação “polls”.</p>\n</section>\n</section>","rootId":"writing-your-first-django-app-part-2","toc":[{"title":"Configuração do banco de dados","anchor":"database-setup","children":[]},{"title":"Criando modelos","anchor":"creating-models","children":[]},{"title":"Ativando modelos","anchor":"activating-models","children":[]},{"title":"Brincando com a API","anchor":"playing-with-the-api","children":[]},{"title":"Escrevendo sua primeira aplicação Django, parte 7","anchor":"introducing-the-django-admin","children":[{"title":"Criando um usuário administrador","anchor":"creating-an-admin-user","children":[]},{"title":"Inicie o servidor de desenvolvimento","anchor":"start-the-development-server","children":[]},{"title":"Entre no site de administração","anchor":"enter-the-admin-site","children":[]},{"title":"Torne a aplicação de enquetes editável no site de administração","anchor":"make-the-poll-app-modifiable-in-the-admin","children":[]},{"title":"Explore a funcionalidade de administração de graça","anchor":"explore-the-free-admin-functionality","children":[]}]}],"breadcrumbs":[{"docname":"intro/index","title":"Introdução","url":"/pt-br/5.0/intro/"}],"prev":{"docname":"intro/tutorial01","title":"Escrevendo seu primeiro app Django, parte 1","url":"/pt-br/5.0/intro/tutorial01/"},"next":{"docname":"intro/tutorial03","title":"Escrevendo sua primeira app Django, parte 3","url":"/pt-br/5.0/intro/tutorial03/"},"formats":{"html":"/pt-br/5.0/intro/tutorial02/","markdown":"/pt-br/5.0/intro/tutorial02.md","json":"/pt-br/5.0/intro/tutorial02.json"},"source":"https://github.com/django/django/blob/stable/5.0.x/docs/intro/tutorial02.txt","official":"https://docs.djangoproject.com/pt-br/5.0/intro/tutorial02/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}