{"title":"Escribiendo su primera aplicación en Django, parte 2","version":"1.9","locale":"es","docname":"intro/tutorial02","url":"/es/1.9/intro/tutorial02/","canonical":"https://djangodocs.dev/es/1.9/intro/tutorial02/","summary":"Este tutorial comienza donde quedó el :doc: Tutorial 1 </intro/tutorial01>. Vamos a configurar la base de datos, crear su primer modelo y recibir una…","html":"<h1>Escribiendo su primera aplicación en Django, parte 2<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-2\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Este tutorial comienza donde quedó el  :doc: Tutorial 1 &lt;/intro/tutorial01&gt;. Vamos a configurar la base de datos, crear su primer modelo y recibir una introducción rápida al sitio administrativo generado automáticamente de Django.</p>\n<section id=\"database-setup\">\n<h2>Configuración de la base de datos<a class=\"heading-anchor\" href=\"#database-setup\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ahora, abra el :file: mysite / settings.py. Es un módulo normal de Python  con variables de nivel de módulo que representan la configuración de Django.</p>\n<p>Por defecto, la configuración utiliza SQLite. Si no tiene mucha experiencia con  bases de datos o simplemente está interesado en probar Django, esta es la opción más fácil. SQLite está incluido en Python, por lo que no tendrá que instalar nada más para soportar su base de datos. Sin embargo, al iniciar su primer proyecto real, es posible que desee utilizar una base de datos más potente como PostgreSQL para evitar dolores de cabeza en el futuro al tener que cambiar entre base de datos.</p>\n<p>Si desea utilizar otra base de datos, instale los enlaces de base de datos apropiados &lt;database-installation&gt;`, y cambie las siguientes claves en el ítem <a class=\"reference internal\" href=\"/es/1.9/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</code></a> <code class=\"docutils literal notranslate\">'default'</code> para que se ajusten a la configuración de conexión de la base de datos.</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/settings/#std-setting-DATABASE-ENGINE\"><code class=\"xref std std-setting docutils literal notranslate\">ENGINE</code></a> – Either\n<code class=\"docutils literal notranslate\">'django.db.backends.sqlite3'</code>,\n<code class=\"docutils literal notranslate\">'django.db.backends.postgresql'</code>,\n<code class=\"docutils literal notranslate\">'django.db.backends.mysql'</code>, or\n<code class=\"docutils literal notranslate\">'django.db.backends.oracle'</code>. Other backends are <a class=\"reference internal\" href=\"/es/1.9/ref/databases/#third-party-notes\"><span class=\"std std-ref\">also available</span></a>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\">NAME</code></a> –el nombre de su base de datos. Si está utilizando SQLite, la base de datos será un archivo en su computadora; en ese caso <a class=\"reference internal\" href=\"/es/1.9/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\">NAME</code></a> debe ser la ruta absoluta completa, incluyendo el respectivo nombre  del archivo. El valor predeterminado, <code class=\"docutils literal notranslate\">os.path.join(BASE_DIR, 'db.sqlite3')</code>, guardará el archivo en el directorio de su proyecto.</p></li>\n</ul>\n<p>Si no está utilizando SQLite como su base de datos, se deben añadir ajustes adicionales tales como <a class=\"reference internal\" href=\"/es/1.9/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\">USER</code></a>, <a class=\"reference internal\" href=\"/es/1.9/ref/settings/#std-setting-PASSWORD\"><code class=\"xref std std-setting docutils literal notranslate\">PASSWORD</code></a>, y <a class=\"reference internal\" href=\"/es/1.9/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\">HOST</code></a> se deben añadir.  Para más información, vea la documentación de referencia para <a class=\"reference internal\" href=\"/es/1.9/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</code></a>.</p>\n<aside class=\"admonition-for-databases-other-than-sqlite admonition\" role=\"note\">\n<p class=\"admonition-title\">Para bases de datos distintas a SQLite</p>\n<p>Si está utilizando una base de datos SQLite, asegúrese de que ha creado ya la base de datos en este punto. Hágalo con el comando «<code class=\"docutils literal notranslate\">CREATE DATABASE database_name;</code>» en la consola interactiva de la base de datos.</p>\n<p>Del mismo modo asegúrese de que la base de datos proporcionada en <code class=\"file docutils literal notranslate\">mysite/settings.py</code> tiene permisos de tipo «create database». Esto permitirá la creación automática de <a class=\"reference internal\" href=\"/es/1.9/topics/testing/overview/#the-test-database\"><span class=\"std std-ref\">test database</span></a> que será necesaria en un tutorial posterior</p>\n<p>Si estás usando SQLite, no es necesario crear nada de antemano - el archivo de base de datos se creará automáticamente cuando sea necesario.</p>\n</aside>\n<p>Mientras que usted está editando <code class=\"file docutils literal notranslate\">mysite / settings.py</code>, configure <a class=\"reference internal\" href=\"/es/1.9/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\">TIME_ZONE</code></a> a su zona horaria.</p>\n<p>Además, observe que :setting: la configuración de INSTALLED_APPS se encuentra en la parte superior del archivo. Esta contiene los nombres de todas las aplicaciones Django que están activadas en esta instancia de Django. Las aplicaciones se pueden usar en diversos proyectos y usted puede empaquetar y distribuirlas para que otras personas las puedan utilizar en sus proyectos.</p>\n<p>Por defecto, <a class=\"reference internal\" href=\"/es/1.9/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> contiene las siguientes aplicaciones y Django viene equipado con todas ellas.</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/contrib/admin/#module-django.contrib.admin\" title=\"django.contrib.admin: Django's admin site.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.admin</code></a> - El sitio administrativo. Usted lo utilizará dentro de poco.</p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.auth</code></a>– Un sistema de autenticación.</p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/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\">django.contrib.contenttypes</code></a>– Un framework para los tipos de contenido.</p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/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\">django.contrib.sessions</code></a> – Un framework de sesión.</p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/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\">django.contrib.messages</code></a> – Un framework de mensajería.</p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/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\">django.contrib.staticfiles</code></a> – Un framework para la gestión de archivos estáticos.</p></li>\n</ul>\n<p>Estas aplicaciones se incluyen de forma predeterminada como una conveniencia para el caso común.</p>\n<p>Algunas de estas aplicaciones utilizan al menos una tabla de base de datos, por lo que necesitamos crear las tablas en la base de datos antes de poder utilizarlas. Para ello, ejecute el siguiente comando:</p>\n<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 manage.py migrate\n</code></pre></div>\n<p>El comando :djadmin:  migrate analiza la :setting: configuración de INSTALLED_APPS  y crea las tablas de base de datos necesarias según la configuración de base de datos en su :file: archivo mysite/settings.py y las migraciones de base de datos distribuidas con la aplicación (trataremos este tema más tarde). Verá un mensaje para cada migración que aplique. Si está interesado, ejecute el cliente de línea de comandos para su base de datos y teclee  <code class=\"docutils literal notranslate\">\\dt</code> (PostgreSQL), <code class=\"docutils literal notranslate\">SHOW TABLES;</code> (MySQL), <code class=\"docutils literal notranslate\">.schema</code> (SQLite), o <code class=\"docutils literal notranslate\">SELECT TABLE_NAME FROM USER_TABLES;</code> (Oracle)  para desplegar las tablas que creó Django.</p>\n<aside class=\"admonition-for-the-minimalists admonition\" role=\"note\">\n<p class=\"admonition-title\">Para los minimalistas</p>\n<p>Como dijimos anteriormente, las aplicaciones predeterminadas se incluyen para el caso común, pero no todos las necesitan. Si usted no necesita alguna o ninguna de ellas, no dude en dejar fuera o borrar las línea(s) correspondientes desde <a class=\"reference internal\" href=\"/es/1.9/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> antes de ejecutar :djadmin:` migrate`. El comando :djadmin: migrate solo ejecutará migraciones para aplicaciones en <a class=\"reference internal\" href=\"/es/1.9/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>.</p>\n</aside>\n</section>\n<section id=\"creating-models\">\n<span id=\"id1\"></span><h2>Creando modelos<a class=\"heading-anchor\" href=\"#creating-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>A continuación definiremos sus modelos, sobre todo su estructura de base de datos, con metadatos adicionales.</p>\n<aside class=\"admonition-philosophy admonition\" role=\"note\">\n<p class=\"admonition-title\">Filosofía</p>\n<p>Un modelo es la fuente única y definitiva de información sobre sus datos. Contiene los campos esenciales y los comportamientos de los datos que usted guarda. Django sigue el :ref: <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>Principio DRY &lt;dry&gt; <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>. El objetivo es definir el modelo de datos en un solo lugar y derivar cosas de este automáticamente.</p>\n<p>Este incluye las migraciones, a diferencia de Ruby On Rails, por ejemplo, las migraciones se derivan totalmente  de su archivo de modelos y son esencialmente sólo un historial a través del cual Django puede pasar para actualizar su esquema de base de datos para que coincida con sus modelos actuales.</p>\n</aside>\n<p>En nuestra sencilla aplicación encuesta, vamos a crear dos modelos:<code class=\"docutils literal notranslate\">Question</code> y <code class=\"docutils literal notranslate\">Choice</code> . Una <code class=\"docutils literal notranslate\">Question</code> tiene una pregunta y una fecha de publicación. Una <code class=\"docutils literal notranslate\">Choice</code> tiene dos campos: el texto de la elección y un conteo de votos. Cada <code class=\"docutils literal notranslate\">Choice</code> se asocia a una <code class=\"docutils literal notranslate\">Question</code>.</p>\n<p>Estos conceptos se representan mediante clases sencillas de Python. Edite el :file:  archivo polls/models.py de modo que se vea de la siguiente manera:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>polls/models.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</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=\"polls/models.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Question</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    question_text <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    pub_date <span class=\"o\">=</span> models<span class=\"o\">.</span>DateTimeField<span class=\"p\">(</span><span class=\"s1\">&#39;date published&#39;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Choice</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    question <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Question<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    choice_text <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    votes <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">(</span>default<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>El código es sencillo. Cada modelo está representado por una clase que subclasifica :class: django.db.models.Model. Cada modelo tiene una serie de variables de clase, cada uno de los cuales representa un campo de la base de datos en el modelo.</p>\n<p>Cada campo está representado por una instancia de una clase :class: ~django.db.models.Field , por ejemplo, <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a> para campos de caracteres y <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a> para variables de tiempo y fecha. Esto le dice a Django qué tipo de datos cada campo contiene.</p>\n<p>El nombre de cada instancia <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> (por ejemplo, <code class=\"docutils literal notranslate\">question_text</code> o `` pub_date``)` es el nombre del campo, en formato adaptado al lenguaje de la máquina. Va a usar este valor en el código Python y su base de datos va a usarlo como el nombre de la columna.</p>\n<p>Puede emplear un primer argumento posicional opcional a una <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> para designar un nombre legible por humanos. Ese se utiliza en varias partes introspectivas de Django y sirve al mismo tiempo como documentación. Si no se proporciona este campo, Django usará el nombre legible por la máquina. En este ejemplo, sólo hemos definido un nombre legible para <code class=\"docutils literal notranslate\">Question.pub_date</code>. Para el resto de los campos en este modelo, el nombre del campo legible por la máquina servirá como el nombre legible por humanos.</p>\n<p>Algunas clases <code class=\"xref py py-class docutils literal notranslate\">Field</code> precisan argumentos. La clase <code class=\"xref py py-class docutils literal notranslate\">CharField</code>, por ejemplo, requiere que usted le asigne un <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.CharField.max_length\" title=\"django.db.models.CharField.max_length\"><code class=\"xref py py-attr docutils literal notranslate\">max_length</code></a>. Esta se utiliza no sólo en el esquema de la base de datos, sino también en la validación como veremos dentro de poco.</p>\n<p>Una clase <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> también puede tener varios argumentos opcionales; en este caso, le hemos fijado al <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.default\" title=\"django.db.models.Field.default\"><code class=\"xref py py-attr docutils literal notranslate\">default</code></a> el valor de <code class=\"docutils literal notranslate\">votos</code> en 0.</p>\n<p>Por último, tenga en cuenta que una relación se define usando <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>. Eso le indica a Django que cada <code class=\"docutils literal notranslate\">Choice</code>  se relaciona con un sola <code class=\"docutils literal notranslate\">Question</code>. Django es compatible con todas las relaciones de bases de datos comunes: varias a una, varias a varias y una a una.</p>\n</section>\n<section id=\"activating-models\">\n<h2>Activando los modelos<a class=\"heading-anchor\" href=\"#activating-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ese pequeño fragmento de código de modelo le proporciona a Django mucha información. Con él Django es capaz de:</p>\n<ul class=\"simple\">\n<li><p>Crear un esquema de base de datos para esta aplicación (oraciones `` CREATE TABLE``).</p></li>\n<li><p>Crear una API de acceso a la base datos Python  para acceder a los objetos <code class=\"docutils literal notranslate\">Question</code> y <code class=\"docutils literal notranslate\">Choice</code>.</p></li>\n</ul>\n<p>Pero primero tenemos que indicarle a nuestro proyecto que la aplicación <code class=\"docutils literal notranslate\">encuestas</code> está instalada.</p>\n<aside class=\"admonition-philosophy admonition\" role=\"note\">\n<p class=\"admonition-title\">Filosofía</p>\n<p>Las aplicaciones Django son “conectables”: Usted puede utilizar una aplicación en diversos proyectos y puede distribuir aplicaciones porque ellas no necesitan estar atadas a una determinada instalación de Django.</p>\n</aside>\n<p>Edite de nuevo el archivo <code class=\"file docutils literal notranslate\">mysite/settings.py</code> y cambie la :setting: configuración INSTALLED_APPS para  incluir la cadena <code class=\"docutils literal notranslate\">'polls.apps.PollsConfig'</code>. Se verá de la siguiente manera:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>mysite/settings.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</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=\"mysite/settings.py\"><code>INSTALLED_APPS <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s1\">&#39;polls.apps.PollsConfig&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.admin&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.auth&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.contenttypes&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.sessions&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.messages&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.staticfiles&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>Ahora Django sabe incluir la aplicación «encuestas». Vamos a ejecutar otro comando:</p>\n<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 manage.py makemigrations polls\n</code></pre></div>\n<p>Usted debe ver algo similar a lo siguiente:</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  0001_initial.py:\n    - Create model Choice\n    - Create model Question\n    - Add field question to choice\n</code></pre></div>\n<p>Al ejecutar <code class=\"docutils literal notranslate\">makemigrations</code>, usted le indica a Django que ha realizado algunos cambios a sus modelos (en este caso, ha realizado cambios nuevos) y que le gustaría que los guarde como una <em>migración</em>.</p>\n<p>Django guarda los cambios en sus modelos como migraciones (y por lo tanto en  su esquema de base de datos); son solo archivos en el disco. Usted puede leer la migración para su nuevo modelo si lo desea, es el archivo <code class=\"docutils literal notranslate\">polls/migrations/0001_initial.py</code>. No se preocupe, no se espera que usted las lea cada vez que Django hace una, sino que están diseñadas para que sean editables en caso de que usted desee modificar  manualmente como Django cambia las cosas.</p>\n<p>Hay un comando que ejecutará las migraciones para usted y gestionará el esquema de base de datos automáticamente; este se denomina <a class=\"reference internal\" href=\"/es/1.9/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a>, y hablaremos de ello en un momento, pero primero, vamos a ver cuál SQL esa migración ejecutaría . El comando <a class=\"reference internal\" href=\"/es/1.9/ref/django-admin/#django-admin-sqlmigrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">sqlmigrate</code></a> recibe nombres de migración y devuelve su SQL:</p>\n<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 manage.py sqlmigrate polls <span class=\"m\">0001</span>\n</code></pre></div>\n<p>Debería ver algo similar a lo siguiente (lo hemos reformateado para facilitar la lectura):</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 Choice</span>\n<span class=\"c1\">--</span>\n<span class=\"k\">CREATE</span> <span class=\"k\">TABLE</span> <span class=\"ss\">&quot;polls_choice&quot;</span> <span class=\"p\">(</span>\n    <span class=\"ss\">&quot;id&quot;</span> <span class=\"nb\">serial</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span> <span class=\"k\">PRIMARY</span> <span class=\"k\">KEY</span><span class=\"p\">,</span>\n    <span class=\"ss\">&quot;choice_text&quot;</span> <span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">200</span><span class=\"p\">)</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span><span class=\"p\">,</span>\n    <span class=\"ss\">&quot;votes&quot;</span> <span class=\"nb\">integer</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span>\n<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=\"k\">TABLE</span> <span class=\"ss\">&quot;polls_question&quot;</span> <span class=\"p\">(</span>\n    <span class=\"ss\">&quot;id&quot;</span> <span class=\"nb\">serial</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span> <span class=\"k\">PRIMARY</span> <span class=\"k\">KEY</span><span class=\"p\">,</span>\n    <span class=\"ss\">&quot;question_text&quot;</span> <span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">200</span><span class=\"p\">)</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span><span class=\"p\">,</span>\n    <span class=\"ss\">&quot;pub_date&quot;</span> <span class=\"k\">timestamp</span> <span class=\"k\">with</span> <span class=\"k\">time</span> <span class=\"k\">zone</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span>\n<span class=\"p\">);</span>\n<span class=\"c1\">--</span>\n<span class=\"c1\">-- Add field question to choice</span>\n<span class=\"c1\">--</span>\n<span class=\"k\">ALTER</span> <span class=\"k\">TABLE</span> <span class=\"ss\">&quot;polls_choice&quot;</span> <span class=\"k\">ADD</span> <span class=\"k\">COLUMN</span> <span class=\"ss\">&quot;question_id&quot;</span> <span class=\"nb\">integer</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span><span class=\"p\">;</span>\n<span class=\"k\">ALTER</span> <span class=\"k\">TABLE</span> <span class=\"ss\">&quot;polls_choice&quot;</span> <span class=\"k\">ALTER</span> <span class=\"k\">COLUMN</span> <span class=\"ss\">&quot;question_id&quot;</span> <span class=\"k\">DROP</span> <span class=\"k\">DEFAULT</span><span class=\"p\">;</span>\n<span class=\"k\">CREATE</span> <span class=\"k\">INDEX</span> <span class=\"ss\">&quot;polls_choice_7aa0f6ee&quot;</span> <span class=\"k\">ON</span> <span class=\"ss\">&quot;polls_choice&quot;</span> <span class=\"p\">(</span><span class=\"ss\">&quot;question_id&quot;</span><span class=\"p\">);</span>\n<span class=\"k\">ALTER</span> <span class=\"k\">TABLE</span> <span class=\"ss\">&quot;polls_choice&quot;</span>\n  <span class=\"k\">ADD</span> <span class=\"k\">CONSTRAINT</span> <span class=\"ss\">&quot;polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id&quot;</span>\n    <span class=\"k\">FOREIGN</span> <span class=\"k\">KEY</span> <span class=\"p\">(</span><span class=\"ss\">&quot;question_id&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">REFERENCES</span> <span class=\"ss\">&quot;polls_question&quot;</span> <span class=\"p\">(</span><span class=\"ss\">&quot;id&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">DEFERRABLE</span> <span class=\"k\">INITIALLY</span> <span class=\"k\">DEFERRED</span><span class=\"p\">;</span>\n\n<span class=\"k\">COMMIT</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>Tenga en cuenta lo siguiente:</p>\n<ul class=\"simple\">\n<li><p>La salida exacta variará dependiendo de la base de datos que esté utilizando. El ejemplo anterior se genera para PostgreSQL.</p></li>\n<li><p>Los nombres de las tablas se generan automáticamente combinando el nombre de la aplicación (“polls”) y el nombre del modelo en minúscula; <code class=\"docutils literal notranslate\">question</code> y <code class=\"docutils literal notranslate\">choice</code>. (Usted puede anular este comportamiento).</p></li>\n<li><p>Las claves primarias (IDs) se agregan automáticamente. (Usted también puede anular esto).</p></li>\n<li><p>Convencionalmente, Django añade <code class=\"docutils literal notranslate\">&quot;_id&quot;</code> al nombre del campo de la clave externa ( sí, usted también puede anular esto).</p></li>\n<li><p>La relación de la clave externa se hace explícita por una restricción``FOREIGN KEY``.  No se preocupe por las partes “DEFERRABLE”; eso solo le indica a PostgreSQL que no aplique la clave externa hasta el final de la transacción.</p></li>\n<li><p>Se adapta a la base de datos que está utilizando, así que los tipos de campos específicos de la bases de datos como <code class=\"docutils literal notranslate\">auto_increment</code>  (MySQL), “serial” (PostgreSQL) o  <code class=\"docutils literal notranslate\">integer primary key autoincrement</code> (SQLite) se gestionan de forma automática. Lo mismo se aplica para la cita de nombres de campos, por ejemplo, el uso de comillas dobles o comillas simples.</p></li>\n<li><p>El comando :djadmin:  sqlmigrate en realidad no ejecuta la migración en su base de datos, sólo la imprime en la pantalla para que pueda ver lo que SQL Django piensa que se requiere. Es útil para comprobar lo que Django va a hacer o si usted tiene administradores de bases de datos que requieran scripts SQL para introducir cambios.</p></li>\n</ul>\n<p>Si le interesa, usted también puede ejecutar <a class=\"reference internal\" href=\"/es/1.9/ref/django-admin/#django-admin-check\"><code class=\"xref std std-djadmin docutils literal notranslate\">python manage.py check</code></a>; este revisa cualquier problema en su proyecto sin hacer migraciones o modificar la base de datos.</p>\n<p>A continuación, ejecute de nuevo <a class=\"reference internal\" href=\"/es/1.9/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a>  para crear esas tablas modelos en su base de datos:</p>\n<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 manage.py migrate\n<span class=\"go\">Operations to perform:</span>\n<span class=\"go\">  Apply all migrations: admin, contenttypes, polls, auth, 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<p>El comando :djadmin:  migrate toma todas las migraciones que no han sido aplicadas (Django rastrea cuales se aplican utilizando una tabla especial en su base de datos llamada  ` django_migrations`) y las ejecuta contra su base de datos; básicamente, sincronizando los cambios que usted ha realizado a sus modelos con el esquema en la base de datos.</p>\n<p>Las migraciones son muy potentes y le permiten modificar sus modelos con el tiempo, a medida que desarrolla su proyecto, sin necesidad de eliminar su base de datos o las tablas y hacer otras nuevas. Este se especializa en la actualización de su base de datos en vivo, sin perder datos. Vamos a hablar de ellas en mayor profundidad más  tarde en el tutorial, pero por ahora, recuerde la guía de tres pasos para hacer cambios de modelo:</p>\n<ul class=\"simple\">\n<li><p>Cambie sus modelos  (en <code class=\"docutils literal notranslate\">models.py</code>).</p></li>\n<li><p>Ejecute :djadmin:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>makemigrations python manage.py &lt;makemigrations&gt; ` para crear migraciones para esos cambios</p></li>\n<li><p>Ejecute <a class=\"reference internal\" href=\"/es/1.9/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">python manage.py migrate</code></a>  para aplicar esos cambios a la base de datos.</p></li>\n</ul>\n<p>La razón por la que hay comandos separados para hacer y aplicar las migraciones es porque usted hará commit de migraciones al sistema de control de versiones y las enviará con su aplicación; ellas no  sólo hacen que su desarrollo sea más fácil, también son utilizables por otros desarrolladores y en ambiente de producción.</p>\n<p>Lea la <span class=\"xref std std-doc\">documentación del sitio adfministrativo Django &lt;/ref/django-admin&gt; `para obtener información detallada sobre lo que puede hacer la utilidad `</span> manage.py``.</p>\n</section>\n<section id=\"playing-with-the-api\">\n<h2>Jugando con la API<a class=\"heading-anchor\" href=\"#playing-with-the-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ahora vayamos al shell  interactivo de Python y juguemos con la API gratuita que Django le proporciona. Para llamar el shell de Python, utilice este comando:</p>\n<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 manage.py shell\n</code></pre></div>\n<p>Estamos usando esto en vez de  simplemente escribir  «python», porque <code class=\"file docutils literal notranslate\">manage.py</code> establece la variable de entorno` DJANGO_SETTINGS_MODULE`, que le suministra a  Django la ruta de importación de Python para su archivo <code class=\"file docutils literal notranslate\">mysite / settings.py</code>.</p>\n<aside class=\"admonition-bypassing-manage-py admonition\" role=\"note\">\n<p class=\"admonition-title\">Omitiendo manage.py</p>\n<p>Si prefiere no utilizar :file: manage.py, no hay problema. Sólo tiene que configurar la :envvar: variable de entorno DJANGO_SETTINGS_MODULE para` mysite.settings`, inicie un shell de Python plano y configure Django:</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\">import</span> <span class=\"nn\">django</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>django<span class=\"o\">.</span>setup<span class=\"p\">()</span>\n</code></pre></div>\n<p>Si esto produce una <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#AttributeError\" title=\"(en Python versión 3.14)\"><code class=\"xref py py-exc docutils literal notranslate\">AttributeError</code></a>, probablemente esté usando una versión de Django que no coincide con la versión del tutorial. Usted querrá ya sea cambiar al tutorial anterior   o a la versión más reciente de Django.</p>\n<p>Usted debe ejecutar `` python`` desde el mismo directorio :file: en el que está manage.py o asegúrese de que el directorio esté en la ruta Python para que <code class=\"docutils literal notranslate\">import mysite</code> funcione.</p>\n<p>Para obtener más información acerca de todo esto, consulte la :doc: documentación del sitio administrativo Django  &lt;/ref/django-admin&gt;.</p>\n</aside>\n<p>Una vez que esté en el shell, explore la :doc: <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>API de base de datos &lt;/topics/db/queries&gt; <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</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=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">polls.models</span> <span class=\"kn\">import</span> Question<span class=\"p\">,</span> Choice   <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>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">[]</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=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n<span class=\"gp\">&gt;&gt;&gt; </span>q <span class=\"o\">=</span> Question<span class=\"p\">(</span>question_text<span class=\"o\">=</span><span class=\"s2\">&quot;What&#39;s new?&quot;</span><span class=\"p\">,</span> pub_date<span class=\"o\">=</span>timezone<span class=\"o\">.</span>now<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>q<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n<span class=\"go\"># Now it has an ID. Note that this might say &quot;1L&quot; instead of &quot;1&quot;, depending</span>\n<span class=\"go\"># on which database you&#39;re using. That&#39;s no biggie; it just means your</span>\n<span class=\"go\"># database backend prefers to return integers as Python long integer</span>\n<span class=\"go\"># objects.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>id\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>q<span class=\"o\">.</span>question_text\n<span class=\"go\">&quot;What&#39;s new?&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>pub_date\n<span class=\"go\">datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=&lt;UTC&gt;)</span>\n\n<span class=\"go\"># Change values by changing the attributes, then calling save().</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>question_text <span class=\"o\">=</span> <span class=\"s2\">&quot;What&#39;s up?&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>save<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>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">[&lt;Question: Question object&gt;]</span>\n</code></pre></div>\n<p>Espere un momento. <code class=\"docutils literal notranslate\">&lt;Question: Question object&gt;``es una representación totalmente inútil de este objeto. Vamos a solucionar esto editando el modelo ``Question</code>  ( en el archivo <code class=\"docutils literal notranslate\">polls/models.py</code>) y añadiendo un método <a class=\"reference internal\" href=\"/es/1.9/ref/models/instances/#django.db.models.Model.__str__\" title=\"django.db.models.Model.__str__\"><code class=\"xref py py-meth docutils literal notranslate\">__str__()</code></a> tanto al modelo <code class=\"docutils literal notranslate\">Question</code> como al modelo <code class=\"docutils literal notranslate\">Choice</code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>polls/models.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</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=\"polls/models.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.encoding</span> <span class=\"kn\">import</span> python_2_unicode_compatible\n\n<span class=\"nd\">@python_2_unicode_compatible</span>  <span class=\"c1\"># only if you need to support Python 2</span>\n<span class=\"k\">class</span> <span class=\"nc\">Question</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">def</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>question_text\n\n<span class=\"nd\">@python_2_unicode_compatible</span>  <span class=\"c1\"># only if you need to support Python 2</span>\n<span class=\"k\">class</span> <span class=\"nc\">Choice</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">def</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>choice_text\n</code></pre></figure>\n<p>Es importante añadir métodos <a class=\"reference internal\" href=\"/es/1.9/ref/models/instances/#django.db.models.Model.__str__\" title=\"django.db.models.Model.__str__\"><code class=\"xref py py-meth docutils literal notranslate\">__str__()</code></a> a sus modelos, no solo para su conveniencia al lidiar con la línea de comandos interactiva, sino también porque las representaciones de objetos se usan en todo el sitio administrativo generado automáticamente de Django.</p>\n<p>Tenga en cuenta que estos son métodos normales de Python . Vamos a añadir un método personalizado, sólo como demostración:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>polls/models.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</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=\"polls/models.py\"><code><span class=\"kn\">import</span> <span class=\"nn\">datetime</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Question</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">def</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>pub_date <span class=\"o\">&gt;=</span> timezone<span class=\"o\">.</span>now<span class=\"p\">()</span> <span class=\"o\">-</span> datetime<span class=\"o\">.</span>timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Tenga en cuenta la adición de import datetime` y from django.utils import timezone`, para  referenciar el módulo estándar de Python <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#module-datetime\" title=\"(en Python versión 3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">datetime</code></a> y las herramientas relacionadas con el huso horario de Django :mod:` django.utils. timezone` respectivamente. Si usted no está familiarizado con el manejo de la zona horaria en Python, usted puede aprender más en los :doc:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>documentos de soporte de zona horaria &lt;/topics/i18n/timezones&gt; <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>.</p>\n<p>Guarde estos cambios e inicie un nuevo shell interactivo Python ejecutando de nuevo`` python manage.py shell``:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</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=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">polls.models</span> <span class=\"kn\">import</span> Question<span class=\"p\">,</span> Choice\n\n<span class=\"go\"># Make sure our __str__() addition worked.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">[&lt;Question: What&#39;s up?&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>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<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;Question: What&#39;s up?&gt;]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>question_text__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;What&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[&lt;Question: What&#39;s up?&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=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n<span class=\"gp\">&gt;&gt;&gt; </span>current_year <span class=\"o\">=</span> timezone<span class=\"o\">.</span>now<span class=\"p\">()</span><span class=\"o\">.</span>year\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span>current_year<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>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<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=\"o\">...</span>\n<span class=\"gr\">DoesNotExist</span>: Question matching query does not exist.\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>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<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>q <span class=\"o\">=</span> Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>was_published_recently<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 to hold the &quot;other side&quot; of a ForeignKey relation</span>\n<span class=\"go\"># (e.g. a question&#39;s choice) which can be accessed via the API.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q <span class=\"o\">=</span> Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<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>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">[]</span>\n\n<span class=\"go\"># Create three choices.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>create<span class=\"p\">(</span>choice_text<span class=\"o\">=</span><span class=\"s1\">&#39;Not much&#39;</span><span class=\"p\">,</span> votes<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>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>create<span class=\"p\">(</span>choice_text<span class=\"o\">=</span><span class=\"s1\">&#39;The sky&#39;</span><span class=\"p\">,</span> votes<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>c <span class=\"o\">=</span> q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>create<span class=\"p\">(</span>choice_text<span class=\"o\">=</span><span class=\"s1\">&#39;Just hacking again&#39;</span><span class=\"p\">,</span> votes<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>c<span class=\"o\">.</span>question\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>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">[&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>count<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>Choice<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>question__pub_date__year<span class=\"o\">=</span>current_year<span class=\"p\">)</span>\n<span class=\"go\">[&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&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>c <span class=\"o\">=</span> q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>filter<span class=\"p\">(</span>choice_text__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;Just hacking&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>c<span class=\"o\">.</span>delete<span class=\"p\">()</span>\n</code></pre></div>\n<p>Para obtener más información sobre las relaciones de modelos, consulte :doc: Accediendo a objetos relacionados &lt;/ref/models/relations&gt;. Para más información sobre cómo utilizar guiones bajos para realizar búsquedas de campo a través de la API, consulte :ref: Búsquedas de campos &lt;field-lookups-intro&gt;. Para más detalles sobre la API de base de datos, consulte nuestra <a class=\"reference internal\" href=\"/es/1.9/topics/db/queries/\"><span class=\"doc\">Referencia de API de base de datos</span></a>.</p>\n</section>\n<section id=\"introducing-the-django-admin\">\n<h2>Presentando el sitio administrativo de Django<a class=\"heading-anchor\" href=\"#introducing-the-django-admin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"admonition-philosophy admonition\" role=\"note\">\n<p class=\"admonition-title\">Filosofía</p>\n<p>La generación de sitios administrativos para su personal o clientes para agregar, modificar y eliminar contenido es un  trabajo aburrido que no requiere mucha creatividad. Por esa razón, Django automatiza completamente la creación de interfaces de sitios administrativos para los modelos.</p>\n<p>Django fue escrito en un entorno de sala de redacción, con una separación muy clara entre «los editores de contenido» y el sitio «público». Los administradores del sitio utilizan el sistema para agregar noticias, eventos, resultados deportivos, etc., y ese contenido se muestra en el sitio público. Django resuelve el problema de crear una interfaz unificada para los administradores del sitio para editar el contenido.</p>\n<p>El  sitio admin no está destinado a ser utilizado por los visitantes del sitio. Es para los administradores del sitio.</p>\n</aside>\n<section id=\"creating-an-admin-user\">\n<h3>Creando un usuario del admin<a class=\"heading-anchor\" href=\"#creating-an-admin-user\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Primero tendremos que crear un usuario que pueda iniciar sesión en el sitio administrativo. Ejecute el siguiente comando:</p>\n<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 manage.py createsuperuser\n</code></pre></div>\n<p>Introduzca su nombre de usuario deseado y pulse 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>A continuación se le solicitará su dirección de correo electrónico deseada:</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>El paso final es introducir su contraseña. Se le pedirá que introduzca su contraseña dos veces, la segunda vez como confirmación de la primera.</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 el servidor de desarrollo<a class=\"heading-anchor\" href=\"#start-the-development-server\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>El sitio administrativo de Django se activa de forma predeterminada. Vamos a iniciar el servidor de desarrollo y a explorarlo.</p>\n<p>Si el servidor no está en marcha, inícielo de la siguiente forma:</p>\n<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 manage.py runserver\n</code></pre></div>\n<p>A continuación, abra un navegador Web y vaya a «/ admin /» en su dominio local, por ejemplo, <a class=\"reference external\" href=\"http://127.0.0.1:8000/admin/\">http://127.0.0.1:8000/admin/</a>. Usted debe ver la pantalla de inicio de sesión del sitio administrativo:</p>\n<img alt=\"Django admin login screen\" src=\"/es/1.9/_images/admin01.png\" />\n<p>Dado que la <a class=\"reference internal\" href=\"/es/1.9/topics/i18n/translation/\"><span class=\"doc\">traducción</span></a> se activa de forma predeterminada, la pantalla de inicio de sesión puede aparecer en su propio idioma, dependiendo de la configuración del navegador y de si Django tiene una traducción para este idioma.</p>\n</section>\n<section id=\"enter-the-admin-site\">\n<h3>Acceda al sitio administrativo<a class=\"heading-anchor\" href=\"#enter-the-admin-site\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ahora, intente iniciar sesión con la cuenta de superusuario que creó en el paso anterior. Debería ver la página de índice del sitio administrativo de Django:</p>\n<img alt=\"Django admin index page\" src=\"/es/1.9/_images/admin02.png\" />\n<p>Usted debería ver algunos tipos de contenidos editables: grupos y usuarios. Ellos son proporcionados por <a class=\"reference internal\" href=\"/es/1.9/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.auth</code></a>, el framework de autenticación enviado por Django.</p>\n</section>\n<section id=\"make-the-poll-app-modifiable-in-the-admin\">\n<h3>Haga que la aplicación encuesta se pueda modificar en el sitio administrativo<a class=\"heading-anchor\" href=\"#make-the-poll-app-modifiable-in-the-admin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Pero ¿Dónde está nuestra aplicación encuesta? No se muestra en la página de índice del sitio administrativo.</p>\n<p>Sólo hay una cosa por hacer: tenemos que indicarle al sitio administrativo que los objetos <code class=\"docutils literal notranslate\">Question</code>  tienen una interfaz del sitio administrativo. Para ello, abra el archivo :file:  polls/admin.py y edítelo para que se vea de la siguiente manera:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>polls/admin.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</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=\"polls/admin.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> Question\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Question<span class=\"p\">)</span>\n</code></pre></figure>\n</section>\n<section id=\"explore-the-free-admin-functionality\">\n<h3>Explore la funcionalidad gratuita del sitio administrativo<a class=\"heading-anchor\" href=\"#explore-the-free-admin-functionality\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ahora que hemos registrado el modelo <code class=\"docutils literal notranslate\">Question</code>, Django sabe que se debe desplegar en la página de índice del sitio administrativo:</p>\n<img alt=\"Django admin index page, now with polls displayed\" src=\"/es/1.9/_images/admin03t.png\" />\n<p>Haga clic en «Questions». Ahora usted está en la página «lista de cambios» para las preguntas. Esta página muestra todas las preguntas de la base de datos y le permite seleccionar una para modificarla. Ahí está la pregunta «¿Qué pasa?» que creamos anteriormente:</p>\n<img alt=\"Polls change list page\" src=\"/es/1.9/_images/admin04t.png\" />\n<p>Haga clic en la pregunta «¿Qué pasa?» para editarla:</p>\n<img alt=\"Editing form for question object\" src=\"/es/1.9/_images/admin05t.png\" />\n<p>Cosas a tener en cuenta aquí:</p>\n<ul class=\"simple\">\n<li><p>El formulario se genera automáticamente a partir del modelo <code class=\"docutils literal notranslate\">Question</code>.</p></li>\n<li><p>Los diferentes tipos de campos del modelo (<a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a>, <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a>)  corresponden al widget de entrada HTML adecuado. Cada tipo de campo sabe cómo mostrarse en el sitio  administrativo de Django.</p></li>\n<li><p>Cada <code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code> tiene atajos de JavaScript sin restricciónes. Las fechas tienen un atajo «Hoy»  y una ventana emergente del calendario, mientras que las horas tienen un atajo «Ahora»  y una ventana emergente conveniente que enumera  las horas que se registran comúnmente.</p></li>\n</ul>\n<p>La parte inferior de la página le da un par de opciones:</p>\n<ul class=\"simple\">\n<li><p>Guardar– Guarda los cambios y retorna a la página de la lista de cambios para este tipo de objeto.</p></li>\n<li><p>Guardar y continuar editando – Guarda los cambios y recarga la página del sitio administrativo para este objeto.</p></li>\n<li><p>Guardar y añadir otro – Guarda los cambios y carga un nuevo formulario vacio para este tipo de objeto.</p></li>\n<li><p>Eliminar – Muestra una página de confirmación de eliminación.</p></li>\n</ul>\n<p>Si el valor de «Date published» no coincide con la hora en la que creó la pregunta en el :doc: Tutorial 1 &lt;/intro/tutorial01&gt;, probablemente significa que se olvidó de establecer el valor correcto para la:setting: configuración de TIME_ZONE. Modifíquelo, recargue la página y compruebe que aparezca el valor correcto.</p>\n<p>Modifique la «Date published» haciendo clic en los atajos “Hoy” y “Ahora”. Después, haga clic en “Guardar y continuar editando”. Luego haga clic en “Historial” en la parte superior derecha. Usted verá una página que enumera todos los cambios realizados a este objeto a través del sitio administrativo de Django, con el registro de tiempo y el nombre de usuario de la persona que realizó el cambio:</p>\n<img alt=\"History page for question object\" src=\"/es/1.9/_images/admin06t.png\" />\n<p>Cuando se sienta cómodo con la API de modelos y se haya familiarizado con el sitio administrativo, lea :doc: la parte 3 de este tutorial &lt;/intro/tutorial03&gt; para aprender sobre cómo agregar más vistas a nuestra aplicación encuestas.</p>\n</section>\n</section>","rootId":"writing-your-first-django-app-part-2","toc":[{"title":"Configuración de la base de datos","anchor":"database-setup","children":[]},{"title":"Creando modelos","anchor":"creating-models","children":[]},{"title":"Activando los modelos","anchor":"activating-models","children":[]},{"title":"Jugando con la API","anchor":"playing-with-the-api","children":[]},{"title":"Presentando el sitio administrativo de Django","anchor":"introducing-the-django-admin","children":[{"title":"Creando un usuario del admin","anchor":"creating-an-admin-user","children":[]},{"title":"Inicie el servidor de desarrollo","anchor":"start-the-development-server","children":[]},{"title":"Acceda al sitio administrativo","anchor":"enter-the-admin-site","children":[]},{"title":"Haga que la aplicación encuesta se pueda modificar en el sitio administrativo","anchor":"make-the-poll-app-modifiable-in-the-admin","children":[]},{"title":"Explore la funcionalidad gratuita del sitio administrativo","anchor":"explore-the-free-admin-functionality","children":[]}]}],"breadcrumbs":[{"docname":"intro/index","title":"Empezando","url":"/es/1.9/intro/"}],"prev":{"docname":"intro/tutorial01","title":"Escribiendo su primera aplicación en Django, parte 1","url":"/es/1.9/intro/tutorial01/"},"next":{"docname":"intro/tutorial03","title":"Escribiendo su primera aplicación en Django, parte 3","url":"/es/1.9/intro/tutorial03/"},"formats":{"html":"/es/1.9/intro/tutorial02/","markdown":"/es/1.9/intro/tutorial02.md","json":"/es/1.9/intro/tutorial02.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/intro/tutorial02.txt","official":"https://docs.djangoproject.com/es/1.9/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","fr","ja","id","pt-br","es"]}