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

Entrada rápida en Django-Modelo de base de datos

Entrada rápida en Django-Tutoriales detallados de modelo de base de datos

La primera parte de esta serie de tutoriales ya se ha completado. En esta lección, sobre la base del tutorial anterior, estableceremos una base de datos, crearemos el primer modelo y utilizaremos un sitio de administración generado automáticamente por Django.

Configuración de la base de datos

Ahora, abra mysite/settings.py. El módulo de configuración de Django establece variables a nivel de módulo de la misma manera que los módulos Python normales.

Por defecto, la configuración utiliza SQLite. Si es nuevo en bases de datos o desea aprender Django, esta es la opción más sencilla. SQLite se incluye en Python, por lo que no es necesario instalar nada para soportar su base de datos. Al comenzar su primer proyecto real, es posible que necesite usar bases de datos más potentes como PostgreSQL, MySQL, etc., y puede configurar el cambio de base de datos.

Si desea usar otra base de datos, instale el enlace de base de datos correspondiente y cambie la configuración predeterminada "default" en la configuración de la base de datos para que sea compatible con la configuración de su conexión de base de datos:

ENGINE – Introduzca 'django.db.backends.sqlite'3', 'django.db.backends.postgresql', 'django.db.backends.mysql', o 'django.db.backends.oracle' NAME – Nombre de la base de datos. Si utiliza SQLite, la base de datos se creará en su computadora; en este caso, el nombre debe ser la ruta absoluta completa del archivo, incluyendo el nombre del archivo. El valor predeterminado es os.path.join(BASE_DIR, "db.sqlite")3)", se almacenará en el archivo del directorio de su proyecto.

Si no utiliza SQLite como base de datos y usa otras configuraciones, como USER, PASSWORD y HOST, deben agregarse. Para obtener más detalles, consulte La documentación de referencia de la base de datos.

Cuando edite mysite/settings.py, configuración de la zona horaria TIME_ZONE.

Además, tenga en cuenta la configuración de INSTALLED_APPS en la parte superior del archivo. Contiene muchos nombres de aplicaciones de Django que se activan en este ejemplo de Django. Las aplicaciones pueden utilizarse en varios proyectos, puede empaquetarlas y usarlas en proyectos de otros.

Por defecto, INSTALLED_APPS contiene las siguientes aplicaciones, todas ellas utilizan Django:

django.contrib.admin – Administración del sitio, aquí se usará rápidamente django.contrib.auth – Sistema de autenticación django.contrib.contenttypes – Una estructura, tipo de contenido django.contrib.sessions – Un framework de sesión django.contrib.messages – Un framework de mensajería django.contrib.staticfiles – Un framework para gestionar archivos estáticos

Estas aplicaciones incluyen la predeterminada, como un ejemplo común y práctico.

Algunas aplicaciones utilizan al menos una tabla de base de datos, por lo que necesitamos crear las tablas en la base de datos para que puedan utilizarse. Para hacer esto, ejecuta el siguiente comando:

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
C:\Python27\mysite>python manage.py migrate
 Operaciones a realizar:
   Aplicar todas las migraciones: admin, contenttypes, auth, sessions
 Ejecutando migraciones:
   Renderizando estados del modelo... HECHO
   Aplicando contenttypes.0001_initial... OK
   Aplicando auth.0001_initial... OK
   Aplicando admin.0001_initial... OK
   Aplicando admin.0002_logentry_remove_auto_add... OK
   Aplicando contenttypes.0002_remove_content_type_name... OK
   Aplicando auth.0002_alter_permission_name_max_length... OK
   Aplicando auth.0003_alter_user_email_max_length... OK
   Aplicando auth.0004_alter_user_username_opts... OK
   Aplicando auth.0005_alter_user_last_login_null... OK
   Aplicando auth.0006_require_contenttypes_0002... OK
   Aplicando auth.0007_alter_validators_add_error_messages... OK
   Aplicando sessions.0001_initial... OK
 C:\Python27\mysite>

El comando migrate se centra en la configuración INSTALLED_APPS y crea según tu mysite/Configuración de base de datos en el archivo settings.py, y migración de tablas de bases de datos según la aplicación (discutiremos esto en futuros tutoriales). Verás cada mensaje aplicable de migración. Si tienes interés, ejecuta la línea de comandos en tu cliente de base de datos, como tipo \dt (PostgreSQL), SHOW TABLES; (MySQL), .schema (SQLite), o SELECT TABLE_NAME FROM USER_TABLES; (Oracle) para mostrar las tablas creadas por Django.

Crear modelo

Ahora, definiremos el modelo - En esencia, el diseño de la base de datos se realiza utilizando otros metadatos.

En nuestra aplicación de encuesta simple, crearemos dos modelos: Question y Choice. Question tiene un título de pregunta y fecha de publicación. Choice tiene dos campos: texto de elección y votos. Cada opción se asocia con una pregunta.

Estos conceptos se representan mediante clases Python simples. Editar polls/models.py, por lo tanto  polls/models.py se ve así:


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

El código es directo. Cada modelo es una subclase de la clase django.db.models.Model. Cada modelo tiene muchas variables de clase, cada una de las cuales se asocia con un campo de la tabla de la base de datos.

Cada campo se representa por una instancia de la clase Field - por ejemplo, CharField representa el campo de caracteres, DateTimeField representa el campo de fecha y hora. Esto le dice a Django qué tipo de datos se guardan en cada campo.

El nombre de cada instancia de Field (por ejemplo, question_text o pub_date) es el nombre del campo, que es un formato amigable para la máquina. Al usar este valor en el código de Python, la base de datos lo usará como nombre de columna.

Los campos también pueden tener parámetros opcionales; en este ejemplo, ya hemos establecido el valor predeterminado de los votos en 0.

Finalmente, hay que tener en cuenta la definición de relaciones, aquí se utiliza la clave externa. Esto le dice a Django que cada opción se asocia con una pregunta. Django admite todas las relaciones de bases de datos comunes: uno a muchos, muchos a muchos y uno a uno.

Activar el modelo

El código del modelo es pequeño, pero representa mucha información de Django. Con él, Django puede:

为这个应用程序创建数据库(CREATE TABLE语句)

创建访问Question和Choice对象的Python数据库访问API

但首先我们需要告诉polls项安装了的应用程序。

再次编辑mysite/settings.py文件,并更改INSTALLED_APPS设置包含字符串“polls.apps.PollsConfig”。结果如下所示:

mysite/settings.py文件内容如下:

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
现在Django知道了polls投票程序。让我们运行另一个命令:
# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
C:\Python27mysite>python manage.py makemigrations polls
 对于'polls'的迁移:
   0001_initial.py:
     - Crear modelo Choice
     - Crear modelo Question
     - Agregar campo question a choice
 C:\Python27\mysite>

通过运行makemigrations,告诉Django你已经对模型进行了某些修改(在这种情况下,已经是最新的了),并且你想将这些更改存储为一个迁移。

迁移是Django如何存储您更改的模型(由你的数据库架构决定)- 它们只是在磁盘上的文件。如果你喜欢,可以读取新的迁移模型,它在文件polls/migrations/0001_initial.py。你不会希望Django每次都读取它们,但设计成可编辑的,你要知道Django是如何变化的,并手动调整。

还有运行migrations的命令,它自动管理数据库模式(表) - 这就是所谓的迁移,让我们看看SQL是如何执行迁移的。sqlmigrate 命令将迁移名称返回到SQL中显示:


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

应该看到类似以下的内容(我们已经重新格式化以提高其可读性):

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

El comando de migración ejecutará todas las migraciones que aún no se han aplicado (Django rastrea cuáles se han aplicado utilizando una tabla especial en la base de datos llamada django_migrations) y las ejecutará en la base de datos. - Básicamente, se utilizarán los modelos para sincronizar los cambios en el esquema de la base de datos.

Uso de la API

Ahora, vamos a entrar en el shell interactivo de Python y en la API proporcionada por Django. Para invocar el comando de línea de Python, utilice el siguiente comando:

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
C:\Python27C:\Python\mysite>python manage.py shell
 Python 2.7.10 (por defecto, Mayo 23 2015, 09:44) [MSC v.1500 64 bit (AMD64)] en wi
 n32
 Escribe "help", "copyright", "credits" o "license" para obtener más información.
 (Consola Interactiva)
 >>>

Sólo escribe "python" en su lugar, porque manage.py configura la variable de entorno DJANGO_SETTINGS_MODULE, lo que da a Django la ruta de importación Python a mysite/archivo settings.py.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
>>> import django
 >>> django.setup()
# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
>>> from polls.models import Question, Choice # Importa las clases de modelo que acabamos de escribir.
 # Todavía no hay preguntas en el sistema.
 >>> Question.objects.all()
 []
 # Crea una nueva Question.
 # El soporte para las zonas horarias está habilitado en el archivo de configuración predeterminado, por lo tanto
 # Django espera un datetime con tzinfo para pub_date. Usa timezone.now()
 # en lugar de datetime.datetime.now() y hará lo correcto.
 >>> from django.utils import timezone
 >>> q = Question(question_text="¿Qué hay de nuevo?", pub_date=timezone.now())
 # Guarda el objeto en la base de datos. Tienes que llamar explícitamente a save()
 >>> q.save()
 # Ahora tiene un ID. Nota que podría decir "1L" en lugar de "1", dependiendo
 # dependiendo de la base de datos que estés utilizando. Eso no es gran cosa; solo significa que tu
 # El backend de la base de datos prefiere devolver enteros como entero Python
 # objects.
 >>> q.id
 1
 # Accede a los valores del campo del modelo a través de atributos de Python.
 >>> q.question_text
 "What's new?"
 >>> q.pub_date
 datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
 # Cambia los valores modificando los atributos y luego llamando a save().
 >>> q.question_text = "What's up?"
 >>> q.save()
 # objects.all() muestra todas las preguntas en la base de datos.
 >>> Question.objects.all()
 [<Question: objeto Question>]

Aquí necesitamos esperar un momento. <Question: objeto Question> es una representación inútil de este objeto. Vamos a resolver este problema: editando el modelo Question (en polls/Agrega un método __str__() a estos modelos Question y Choice (en el archivo models.py):

polls/El contenido del archivo models.py es el siguiente:
 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
import datetime
 from django.utils.encoding import python_2_unicode_compatible
 @python_2_unicode_compatible # solo si necesitas soportar Python 2
 from django.utils import timezone
     class Question(models.Model):
     def __str__(self):
         return self.question_text
 @python_2_unicode_compatible # solo si necesitas soportar Python 2
 class Choice(models.Model):
     class Question(models.Model):
     def __str__(self):
         return self.choice_text

Agregar el método __str__() es muy importante, usar la sugerencia interactiva para procesar agregar a la modelo, no solo es conveniente para uno mismo, sino también porque la representación del objeto se utiliza para toda la generación automática de administración de Django.

注意,这些都是正常的Python方法。让我们添加一个自定义的方法,这里只是为了演示:polls/Nota: todos estos son métodos Python normales. Vamos a agregar un método personalizado, aquí solo para demostrar: polls

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

Nota: aquí se agrega import datetime y from django.utils import timezone, que importa el módulo estándar de datetime de Python y los utilitarios relacionados con la zona horaria de Django en django.utils.timezone. Si no estás familiarizado con el manejo de la zona horaria en Python, puedes leer  Documentación de soporte de zona horaria.

Guarda estas modificaciones y ejecuta nuevamente python manage.py shell para iniciar un nuevo shell de Python:

 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
>>> from polls.models import Question, Choice
 # Asegúrate de que nuestra adición __str__() funcionó.
 >>> Question.objects.all()
 [<Pregunta: ¿Qué está pasando?>]
 # Django proporciona una API de búsqueda de base de datos rica que se mueve completamente por
 # Argumentos de palabra clave.
 >>> Question.objects.filter(id=1)
 [<Pregunta: ¿Qué está pasando?>]
 >>> Question.objects.filter(question_text__startswith='What')
 [<Pregunta: ¿Qué está pasando?>]
 # Obtener la pregunta publicada este año.
 >>> from django.utils import timezone
 >>> current_year = timezone.now().year
 >>> Question.objects.get(pub_date__year=current_year)
 <Pregunta: ¿Qué pasa?>
 # Solicitar un ID que no existe, esto levantará una excepción.
 >>> Question.objects.get(id=2)
 Traceback (última llamada):
     ...
 DoesNotExist: No existe pregunta que coincida con la consulta.
 # La búsqueda por clave primaria es el caso más común, por lo que Django proporciona un
 # atajo para primaria-búsqueda exacta de claves.
 # Lo siguiente es idéntico a Question.objects.get(id=1).
 >>> Question.objects.get(pk=1)
 <Pregunta: ¿Qué pasa?>
 # Asegúrate de que nuestro método personalizado funcionó.
 >>> q = Question.objects.get(pk=1)
 >>> q.was_published_recently()
 True
 # Proporciona a la Pregunta un par de Opciones. La llamada create construye un nuevo
 # El objeto Choice, realiza la declaración INSERT, agrega la opción al conjunto
 # del número de opciones disponibles y devuelve el nuevo objeto Choice. Django crea
 # Un conjunto para contener el "otro lado" de una relación ForeignKey
 # (por ejemplo, una opción de pregunta) que puede ser accedida a través de la API.
 >>> q = Question.objects.get(pk=1)
 # Mostrar cualquier opción de la colección de objetos relacionados -- Ninguno hasta ahora.
 >>> q.choice_set.all()
 []
 # Cree tres opciones.
 >>> q.choice_set.create(choice_text='no mucho', votos=0)
 <Opción: no mucho>
 >>> q.choice_set.create(choice_text='El cielo', votos=0)
 <Opción: El cielo>
 >>> c = q.choice_set.create(choice_text='¡De nuevo, haciéndolo!', votos=0)
 # Los objetos Opción tienen acceso a API a sus objetos Pregunta relacionados.
 >>> c.question
 <Pregunta: ¿Qué pasa?>
 # y viceversa: los objetos Pregunta obtienen acceso a los objetos Opción.
 >>> q.choice_set.all()
 [<Opción: no mucho>, <Opción: El cielo>, <Opción: ¡De nuevo, haciéndolo!>]
 >>> q.choice_set.count()
 3
 # La API sigue automáticamente las relaciones hasta donde necesite.
 # Utilice dos guiones bajos para separar relaciones.
 # Funciona a varios niveles de profundidad como desee; no hay límite.
 # Encuentre todas las Opciones para cualquier pregunta cuyo pub_date esté en este año
 # (reutilizando la variable 'current_year' que creamos anteriormente).
 >>> Choice.objects.filter(question__pub_date__year=current_year)
 [<Opción: no mucho>, <Opción: El cielo>, <Opción: ¡De nuevo, haciéndolo!>]
 # Eliminemos una de las opciones. Utilice delete() para eso.
 >>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
 >>> c.delete()

介绍 Django管理

创建一个管理员用户

首先,我们需要创建可以登录到管理界面的用户。运行以下命令:

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

输入你想要的用户名(随便一个),然后按Enter。

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

然后,将提示输入电子邮件地址(随便一个):

 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
Email address: [email protected]

最后一步是要输入密码。它会要求输入密码两次,第二次为第一的确认。

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

启动开发服务器

Django管理站点默认激活。让我们启动开发服务器,并探索它。

如果服务器未运行,启动它,如下所示:

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

现在,打开Web浏览器,进入“/admin/” 本地域名- 例如,   http://127.0.0.1:8000/admin/  应该看到管理员登录界面:  

由于移在默认情况下开启,登录屏幕可能会显示在你自己的语言, 由于翻译在默认情况下开启,登录屏幕可能会显示在你自己的语言,

输入管理员网站

现在,尝试与在上一步中创建的超级用户帐号登录。应该会看到 Django 管理的首页:  

你应该看到一些可编辑内容:组和用户。它们由django.contrib.auth,Django的认证框架提供。

修改poll 管理程序

poll应用程序在哪里?它不会显示在管理索引页面上。

只有一件事要做:我们需要告诉管理员这个Question对象有一个管理界面。要做到这一点,打开polls/admin.py文件,并修改它如下:  

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

Explorar las funciones de administración

Ahora, hemos registrado Question, Django sabe que debe mostrarse en la página principal de administración:

Haga clic en 'Questions'. Ahora, en la página 'lista de cambios', verá todas las preguntas en la base de datos y podrá seleccionar una para modificar. También hay preguntas que hemos creado anteriormente:

Haga clic en esta pregunta '¿Qué hay de nuevo?' para editar:

Aquí se enumeran las cosas a tener en cuenta:

 

Los formularios se generan automáticamente a partir del modelo (Question).

 

Los tipos de campos diferentes (DateTimeField, CharField) corresponden a los componentes de entrada HTML correspondientes. Cada tipo de campo sabe cómo se muestra en Django.

Cada campo DateTimeField recibe un atajo rápido de JavaScript. La fecha recibe un atajo rápido 'Hoy' y se abre un calendario, y se han obtenido múltiples atajos rápidos 'Ahora' y se abre una ventana que enumera las horas de entrada comunes.

Modifique 'Fecha publicada' y haga clic en los atajos rápidos 'Hoy' y 'Ahora'. Luego haga clic en 'Guardar y continuar editando'. Luego haga clic en 'Historial' en la esquina superior derecha. Verá una página que lista todos los cambios realizados a este objeto a través de Django, nombre de usuario del modificador y marca de tiempo:   Descarga de código:  http://pan.baidu.com/s/1jGR3wDg