Модели Django

Django обеспечивает отличную поддержку различных баз данных, включая: PostgreSQL, MySQL, SQLite, Oracle.

Django предоставляет единый API вызовов для этих баз данных. Мы можем выбирать разные базы данных в соответствии с потребностями бизнеса.

MySQL — наиболее часто используемая база данных в веб-приложениях. В этой главе мы будем использовать MySQL в качестве примера для демонстрации. Вы можете использоватьУчебник по MySQLна этом сайте, чтобы узнать больше об основах MySQL.

Если вы еще не установили драйвер mysql, вы можете выполнить следующую команду для его установки:

sudo pip3 install pymysql

Django ORM

Модели Django используют встроенный ORM.

Объектно-реляционное отображение (сокращенно ORM) используется для реализации преобразования между данными разных типов систем в объектно-ориентированных языках программирования.

ORM выступает в качестве моста между уровнем бизнес-логики и уровнем базы данных.

ORM автоматически сохраняет объекты программы в базе данных, используя метаданные, описывающие отображение между объектами и базой данных.

Преимущества использования ORM:

  • Повышает эффективность разработки.
  • Можно плавно переключаться между разными базами данных.

Недостатки использования ORM:

  • Когда код ORM преобразуется в SQL-запросы, это занимает определённое время, и эффективность выполнения снижается.
  • При длительном написании кода ORM снижается умение писать SQL-запросы.

Процесс разбора ORM:

  • 1. ORM преобразует код Python в SQL-запросы.
  • 2. SQL-запрос передаётся на сервер базы данных через pymysql.
  • 3. SQL-запрос выполняется в базе данных, и возвращается результат.

Таблица сопоставления ORM:


Конфигурация базы данных

Как Django использует базу данных MySQL

Синтаксис создания базы данных MySQL (ORM не может работать на уровне базы данных, может работать только с таблицами данных):

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

Например, мы создаём базу данных с именем example и указываем кодировку utf8:

create database example default charset=utf8;   

В файле settings.py проекта найдите элемент конфигурации DATABASES и измените его информацию на:

HelloWorld/HelloWorld/settings.py: код файла:

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # Движок базы данных 'NAME': 'example', # Имя базы данных 'HOST': '127.0.0.1', # Адрес базы данных, IP-адрес локальной машины 127.0.0.1 'PORT': 3306, # Порт 'USER': 'root', # Имя пользователя базы данных 'PASSWORD': '123456', # Пароль базы данных } }

Если вы используете Python2.x, здесь добавлены китайские комментарии, поэтому вам нужно добавить следующее в начало файла HelloWorld/settings.py:# -*- coding: UTF-8 -*-。

Выше указаны имя базы данных и информация о пользователе, которые совпадают с соответствующими настройками базы данных и пользователя в MySQL. Django подключается к соответствующей базе данных и пользователю в MySQL в соответствии с этой настройкой.

Затем укажите Django использовать модуль pymysql для подключения к базе данных mysql:

Пример

# Импортируйте модули и настройте в __init__.py в том же каталоге, что и settings.py
import pymysql
pymysql.install_as_MySQLdb()

Определить модель

Создать приложение

Django требует, чтобы для использования моделей вы создали приложение. Мы используем следующую команду, чтобы создать приложение с именем TestModel:

django-admin startapp TestModel

Структура каталогов выглядит следующим образом:

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

Мы изменяем файл TestModel/models.py, код выглядит следующим образом:

HelloWorld/TestModel/models.py: Код файла:

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

Приведённое выше имя класса представляет имя таблицы базы данных, а сам класс наследует models.Model. Поля внутри класса представляют поля (name) в таблице данных, а типы данных определяются CharField (эквивалент varchar), DateField (эквивалент datetime). Параметр max_length ограничивает длину.

Tungaanut, settings.py-mi INSTALLED_APPS entry nani, maligassiuqtuq:

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

Command line-mi aulattijjut:

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

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

Takuguvit "Creating table..." atuinnarmi, data tablepi sanajaujumajuuq.

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

Table atiq maligassiuq: application atiq_class atiq (assigiinngitsumik, TestModel_test).

Malugit:Nalaummik models-mi table-mut primary key aturtaunngimmata, Django automatic-umik id ilalippaa primary key-tut.

Error message-ngit piujut

Malittumik error message takuguvit aulattijjut ingikkuq:

Patujut MySQLclient maanna Python 3.4-tut ikajuqatauniq, taava Python anginirsaq version atuqquvit, allanngortit maligassiuqtuq:

Error message-mi file path atuqillugu, base.py file nani path ...site-packages\Django-2.0-py3.6.egg\django\db\backends\mysql-mi, comment out marruk code line-ngit (code file-mut sivanut):

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

Ilurnik, error-mi code file path information click, automatic-umik error file-mi line number-mut jumps. Taavani, error code line comment out.

Malittumik error message takuguvit:

Error-mi code file path click, error file-mi line number-mut jump, taavani error code line sivanut malittumik ilali:

query = query.encode()


Работа с базой данных

Далее мы добавляем файл testdb.py (описан ниже) в каталог HelloWorld и изменяем urls.py:

HelloWorld/HelloWorld/urls.py: Код файла:

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

Добавление данных

Чтобы добавить данные, нужно сначала создать объект, а затем выполнить функцию save, что эквивалентно INSERT в SQL:

HelloWorld/HelloWorld/testdb.py: код файла:

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # Работа с базой данных def testdb(request): test1 = Test(name='example') test1.save() return HttpResponse("<p>Данные успешно добавлены!</p>")

Посетитеhttp://127.0.0.1:8000/testdbЗатем вы увидите сообщение о том, что данные успешно добавлены.

Результат вывода следующий:

Получение данных

Django предоставляет несколько способов извлечения содержимого базы данных, как показано в следующем коде:

HelloWorld/HelloWorld/testdb.py: код файла:

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # Работа с базой данных def testdb(request): # Инициализация response = "" response1 = "" # Используйте метод all() менеджера objects модели для получения всех строк данных, эквивалентно SELECT * FROM в SQL. listTest = Test.objects.all() # filter эквивалентен WHERE в SQL, можно задавать условия для фильтрации результатов response2 = Test.objects.filter(id=1) # Получить один объект response3 = Test.objects.get(id=1) # Ограничить возвращаемые данные, эквивалентно OFFSET 0 LIMIT 2 в SQL; Test.objects.order_by('name')[0:2] # Сортировка данных Test.objects.order_by("id") # Эти методы можно объединять в цепочку Test.objects.filter(name="example").order_by("id") # Вывод всех данных for var in listTest: response1 += var.name + " " response = response1 return HttpResponse("<p>" + response + "</p>")

Обновление данных

Чтобы изменить данные, можно использовать save() или update():

HelloWorld/HelloWorld/testdb.py: код файла:

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # Работа с базой данных def testdb(request): # Изменить поле name у записи с id=1, затем сохранить, эквивалентно UPDATE в SQL test1 = Test.objects.get(id=1) test1.name = 'Google' test1.save() # Другой способ #Test.objects.filter(id=1).update(name='Google') # Изменить все столбцы # Test.objects.all().update(name='Google') return HttpResponse("<p>Успешно изменено</p>")

Удаление данных

Чтобы удалить объект из базы данных, достаточно вызвать метод delete() этого объекта:

HelloWorld/HelloWorld/testdb.py: код файла:

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # Работа с базой данных def testdb(request): # Удалить данные с id=1 test1 = Test.objects.get(id=1) test1.delete() # Другой способ # Test.objects.filter(id=1).delete() # Удалить все данные # Test.objects.all().delete() return HttpResponse("<p>Успешно удалено</p>")
Другие расширения