Modelos de Django

Django proporciona un excelente soporte para varias bases de datos, incluyendo: PostgreSQL, MySQL, SQLite, Oracle.

Django proporciona una API de llamada unificada para estas bases de datos. Podemos elegir diferentes bases de datos según las necesidades de nuestro negocio.

MySQL es la base de datos más utilizada en aplicaciones web. En este capítulo usaremos Mysql como ejemplo. Puedes, a través de este sitio,Tutorial de MySQLaprender más sobre los conceptos básicos de MySQL.

Si no tienes instalado el controlador de mysql, puedes ejecutar el siguiente comando para instalarlo:

sudo pip3 install pymysql

Django ORM

Los modelos de Django usan el ORM incorporado.

El mapeo objeto-relacional (Object Relational Mapping, abreviado ORM) se utiliza para lograr la conversión de datos entre sistemas de diferentes tipos en lenguajes de programación orientados a objetos.

El ORM actúa como un puente entre la capa de lógica de negocio y la capa de base de datos.

El ORM utiliza metadatos que describen el mapeo entre objetos y base de datos para persistir automáticamente los objetos del programa en la base de datos.

Ventajas de usar ORM:

  • Mejora la eficiencia del desarrollo.
  • Se puede cambiar entre diferentes bases de datos sin problemas.

Desventajas de usar ORM:

  • Al convertir el código ORM en sentencias SQL, se necesita cierto tiempo, y la eficiencia de ejecución puede disminuir.
  • Escribir código ORM durante mucho tiempo puede reducir la habilidad para escribir sentencias SQL.

Proceso de resolución de ORM:

  • 1. ORM convertirá el código Python en sentencias SQL.
  • 2. Las sentencias SQL se envían al servidor de base de datos a través de pymysql.
  • 3. Las sentencias SQL se ejecutan en la base de datos y se devuelven los resultados.

Tabla de correspondencia de ORM:


Configuración de la base de datos

Cómo usar Django con la base de datos mysql

Sintaxis para crear la base de datos MySQL (ORM no puede operar a nivel de base de datos, solo puede operar a nivel de tablas de datos):

create database 数据库名称 default charset=utf8; # 防止编码问题,指定为 utf8

Por ejemplo, creamos una base de datos llamada ejemplo, especificando la codificación como utf8:

create database ejemplo default charset=utf8;   

En el archivo settings.py del proyecto, encontramos el elemento de configuración DATABASES y modificamos su información de la siguiente manera:

HelloWorld/HelloWorld/settings.py: Código del archivo:

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # Motor de base de datos 'NAME': 'ejemplo', # Nombre de la base de datos 'HOST': '127.0.0.1', # Dirección de la base de datos, dirección IP local 127.0.0.1 'PORT': 3306, # Puerto 'USER': 'root', # Nombre de usuario de la base de datos 'PASSWORD': '123456', # Contraseña de la base de datos } }

Si usas la versión Python2.x, aquí se han agregado comentarios en chino, por lo que debes agregar al inicio del archivo HelloWorld/settings.py# -*- coding: UTF-8 -*-。

Lo anterior incluye la información del nombre de la base de datos y del usuario, que es la misma que la configuración correspondiente en MySQL. Django se conecta con la base de datos y el usuario correspondientes en MySQL según esta configuración.

A continuación, dile a Django que use el módulo pymysql para conectarse a la base de datos mysql:

Ejemplo

# En el __init__.py que está en el mismo directorio que settings.py, importa módulos y realiza la configuración
import pymysql
pymysql.install_as_MySQLdb()

Definir el modelo

Crear la app

Django estipula que para usar modelos, debes crear una app. Usamos el siguiente comando para crear una app TestModel:

django-admin startapp TestModel

La estructura de directorios es la siguiente:

HelloWorld
|-- HelloWorld
|-- manage.py
...
|-- TestModel
|   |-- __init__.py
|   |-- admin.py
|   |-- models.py
|   |-- tests.py
|   `-- views.py

Modificamos el archivo TestModel/models.py, el código es el siguiente:

HelloWorld/TestModel/models.py: Código del archivo:

# models.py from django.db import models class Test(models.Model): name = models.CharField(max_length=20)

Los nombres de clase anteriores representan los nombres de las tablas de la base de datos y heredan de models.Model. Los campos dentro de la clase representan los campos de la tabla de datos (name). Los tipos de datos están determinados por CharField (equivalente a varchar), DateField (equivalente a datetime), y el parámetro max_length limita la longitud.

A continuación, en settings.py, encuentra el elemento INSTALLED_APPS, como se muestra a continuación:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'TestModel',               # 添加此项
)

Ejecuta en la línea de comandos:

$ python3 manage.py migrate   # 创建表结构

$ python3 manage.py makemigrations TestModel  # 让 Django 知道我们在我们的模型有一些变更
$ python3 manage.py migrate TestModel   # 创建表结构

Al ver varias líneas con el texto "Creating table…", tu tabla de datos se ha creado.

Creating tables ...
……
Creating table TestModel_test  #我们自定义的表
……

La estructura del nombre de la tabla es: nombre_de_aplicación_nombre_de_clase (por ejemplo: TestModel_test).

Nota:Aunque no establezcamos una clave primaria para la tabla en models, Django agregará automáticamente un id como clave primaria.

Mensajes de error comunes

Si al ejecutar el comando anterior aparece el siguiente mensaje de error:

El motivo es que MySQLclient actualmente solo es compatible con Python 3.4, por lo que si usas una versión superior de Python, debes modificar lo siguiente:

A través de la ruta del archivo en el mensaje de error, encuentra el archivo base.py en la ruta ...site-packages\Django-2.0-py3.6.egg\django\db\backends\mysql, y comenta estas dos líneas de código (el código está al principio del archivo):

if version < (1, 3, 13):
    raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

Generalmente, al hacer clic en la información de la ruta del archivo de código del error, se saltará automáticamente a la línea en el archivo del error; en ese momento, comentamos la línea de código que tiene el error.

Si aparece el siguiente mensaje de error:

Hacemos clic en la ruta del archivo de código del error, saltamos a la línea en el archivo del error, y en ese momento agregamos antes de la línea de código con el error:

query = query.encode()


Operaciones de base de datos

A continuación, agregamos el archivo testdb.py en el directorio HelloWorld (se presenta a continuación) y modificamos urls.py:

HelloWorld/HelloWorld/urls.py: Código del archivo:

from django.urls import path from . import views,testdb urlpatterns = [ path('ejemplo/', views.ejemplo), path('testdb/', testdb.testdb), ]

Agregar datos

Para agregar datos, primero debes crear un objeto y luego ejecutar la función save, lo que equivale a INSERT en SQL:

HelloWorld/HelloWorld/testdb.py: Código del archivo:

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # Operaciones de base de datos def testdb(request): test1 = Test(name='ejemplo') test1.save() return HttpResponse("<p>¡Datos agregados con éxito!</p>")

Visitahttp://127.0.0.1:8000/testdbEntonces podrás ver el mensaje de que los datos se agregaron con éxito.

El resultado de salida es el siguiente:

Obtener datos

Django proporciona varias formas de obtener el contenido de la base de datos, como se muestra en el siguiente código:

HelloWorld/HelloWorld/testdb.py: Código del archivo:

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # Operaciones de base de datos def testdb(request): # Inicialización response = "" response1 = "" # Obtén todas las filas de datos mediante el método all() del administrador de modelos objects, equivalente a SELECT * FROM en SQL. listTest = Test.objects.all() # filter equivale a WHERE en SQL; se pueden establecer condiciones para filtrar resultados. response2 = Test.objects.filter(id=1) # Obtener un solo objeto response3 = Test.objects.get(id=1) # Limita los datos devueltos; equivale a OFFSET 0 LIMIT 2 en SQL; Test.objects.order_by('name')[0:2] #ordenar datos Test.objects.order_by("id") # El método anterior se puede encadenar Test.objects.filter(name="ejemplo").order_by("id") # Imprimir todos los datos for var in listTest: response1 += var.name + " " response = response1 return HttpResponse("<p>" + response + "</p>")

Actualizar datos

Para modificar datos, puedes usar save() o update():

HelloWorld/HelloWorld/testdb.py: Código del archivo:

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # Operaciones de base de datos def testdb(request): # Modificar el campo name de uno con id=1, luego guardar, equivalente a UPDATE en SQL test1 = Test.objects.get(id=1) test1.name = 'Google' test1.save() # Otra forma #Test.objects.filter(id=1).update(name='Google') # Modificar todas las columnas # Test.objects.all().update(name='Google') return HttpResponse("<p>Modificado correctamente</p>")

Eliminar datos

Para eliminar un objeto de la base de datos, basta con llamar al método delete() de dicho objeto:

HelloWorld/HelloWorld/testdb.py: Código del archivo:

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # Operaciones de base de datos def testdb(request): # Eliminar los datos con id=1 test1 = Test.objects.get(id=1) test1.delete() # Otra forma # Test.objects.filter(id=1).delete() # Eliminar todos los datos # Test.objects.all().delete() return HttpResponse("<p>Eliminado correctamente</p>")
Otras extensiones