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

Дjango Quick Start - Модель базы данных

Дjango Quick Start - Д详细 операция модели базы данных

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

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

Теперь откройте mysite/settings.py. Модуль настроек Django устанавливает переменные уровня модуля, как и обычный модуль Python.

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

ENGINE – Введите 'django.db.backends.sqlite3', 'django.db.backends.postgresql', 'django.db.backends.mysql' или 'django.db.backends.oracle' NAME – имя базы данных. Если используется SQLite, база данных будет создана файлом на вашем компьютере; в этом случае имя должно быть полным абсолютным путём к файлу, включая имя файла. По умолчанию это os.path.join(BASE_DIR,“db.sqlite3”) и будет храниться в файле в вашем проектном каталоге.

Если вы не используете SQLite в качестве базы данных, а используете другие настройки, такие как USER, PASSWORD и HOST, они должны быть включены. Для получения дополнительной информации см. Референсная документация базы данных.

Когда вы редактируете mysite/settings.py, настройка времени зоны TIME_ZONE.

Кроме того, обратите внимание на настройку INSTALLED_APPS в начале файла. Она включает имена всех активированных приложений Django в данном примере Django. Приложения могут использоваться в нескольких проектах, и вы можете打包 их для использования в других проектах.

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

django.contrib.admin – административный сайт, который很快 будет использоваться django.contrib.auth – система аутентификации django.contrib.contenttypes – фреймворк, содержащий типы содержимого django.contrib.sessions – фреймворк для сеансов django.contrib.messages – фреймворк для передачи сообщений django.contrib.staticfiles – фреймворк для управления статическими файлами

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

Некоторые из этих приложений используют至少 одну таблицу базы данных, поэтому нам нужно создать таблицы в базе данных, чтобы их можно было использовать. Для этого выполните следующую команду:

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
C:\Python27\mysite>python manage.py migrate
 Операции для выполнения:
   Применить все миграции: admin, contenttypes, auth, sessions
 Запуск миграций:
   Отрисовка состояния модели... Готово
   Применение contenttypes.0001_initial... ОК
   Применение auth.0001_initial... ОК
   Применение admin.0001_initial... ОК
   Применение admin.0002_logentry_remove_auto_add... ОК
   Применение contenttypes.0002_remove_content_type_name... ОК
   Применение auth.0002_alter_permission_name_max_length... ОК
   Применение auth.0003_alter_user_email_max_length... ОК
   Применение auth.0004_alter_user_username_opts... ОК
   Применение auth.0005_alter_user_last_login_null... ОК
   Применение auth.0006_require_contenttypes_0002... ОК
   Применение auth.0007_alter_validators_add_error_messages... ОК
   Применение sessions.0001_initial... ОК
 C:\Python27\mysite>

Команда migrate сосредоточена на настройках INSTALLED_APPS и создает базу данных в соответствии с настройками базы данных в вашем файле mysite/settings.py, а также мигрирует любые таблицы базы данных приложения (мы обсудим это в будущих уроках). Вы увидите сообщения о каждом применении移植а. Если вы заинтересованы, выполните команду в командной строке в вашем клиенте базы данных, например, тип \dt (PostgreSQL), SHOW TABLES; (MySQL), .schema (SQLite) или SELECT TABLE_NAME FROM USER_TABLES; (Oracle), чтобы показать таблицы, созданные Django.

Создание модели

Теперь мы определим модель - по сути, это дизайн базы данных, используя другие метаданные.

В нашей простой приложении для опросов мы создадим два модели: Question и Choice. Question имеет заголовок вопроса и дату публикации. Choice имеет два поля: текст выбора и количество голосов. Каждая опция связана с一个问题.

Эти концепции представляются простыми классами Python. Редактируйте файл polls/models.py, чтобы  polls/models.py выглядит так:


 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
from django.db import models
 class Question(models.Model):
     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)

Этот код прямой. Каждая модель является подклассом класса django.db.models.Model. Каждая модель имеет множество классовых переменных, каждая из которых связана с полем таблицы базы данных.

Каждое поле представлено экземпляром класса Field – например, CharField представляет строковое поле, DateTimeField представляет дату и время. Это говорит Django, что тип данных, сохраняемый каждым полем.

Имя каждого экземпляра Field (например, question_text или pub_date) является именем поля, это машинно-читаемый формат. В Python используется этот значений, а база данных использует его в качестве имени столбца.

Поля также могут иметь различные опциональные параметры; в этом примере мы установили значение по умолчанию для голосов в 0.

Важно отметить определение отношений, здесь используется внешняя ссылка. Это говорит Django, что каждый вариант связан с一个问题. Django поддерживает все распространенные типы отношений баз данных: одно-ко-много, много-ко-много и одно-ко-одному.

Активировать модель

Код модели очень мал, но он представляет много информации о Django. С его помощью Django может:

Создание базы данных для этого приложения (запрос CREATE TABLE)

Создание доступа к объектам Python для базы данных для Question и Choice

Но сначала нам нужно сообщить polls, какие приложения установлены.

Снова отредактируйте файл mysite/settings.py и измените настройку INSTALLED_APPS, чтобы она содержала строку “polls.apps.PollsConfig”. Результат будет выглядеть так:

содержимое файла mysite/settings.py приведено ниже:

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.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 : ru.oldtoolbag.com
# Date : 2020-08-08
C:\Python27\mysite>python manage.py makemigrations polls
 Migrations for 'polls':
   0001_initial.py:
     - Create model Choice
     - Create model Question
     - Add field question to 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 : ru.oldtoolbag.com
# Date : 2020-08-08
$ python manage.py sqlmigrate polls 0001

应该看到类似下面的东西(我们已经重新格式化它的可读性):

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
C:\Python27\mysite>python manage.py sqlmigrate polls 0001
 BEGIN;
 --
 -- Create model Choice
 --
 CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "c
 choice_text" varchar(200) not NULL, "votes" integer not NULL);
 --
 -- Create model Question
 --
 CREATE TABLE "polls_question" ("id" integer not NULL PRIMARY KEY AUTOINCREMENT,
 "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL)
 --
 -- Добавить поле question к choice
 --
 ALTER TABLE "polls_choice" RENAME TO "polls_choice__old";
 CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "c
 "choice_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" ON "polls_choice" ("question_id");
 COMMIT;
 C:\Python27\mysite>

Команды миграции выполняют все еще не примененные миграции (Django отслеживает их с помощью специальной таблицы django_migrations в базе данных) и запускают их в базе данных - по сути, синхронизируют изменения в схеме базы данных с использованием моделей.

Использование API

Теперь让我们进入交互ный Python shell и API, предоставляемые Django. Чтобы запустить команду из командной строки Python, используйте следующую команду:

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
C:\Python27\mysite>python manage.py shell
 Python 2.7.10 (default, 23 мая 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] на wi
 n32
 Введите "help", "copyright", "credits" или "license", чтобы получить больше информации.
 (Интерактивная консоль)
 >>>

Достаточно ввести "python", так как manage.py устанавливает переменную окружения DJANGO_SETTINGS_MODULE, что предоставляет Django путь к导入у до файла mysite/settings.py.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
>>> import django
 >>> django.setup()
# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
>>> from polls.models import Question, Choice # импортировать классы моделей, которые мы только что написали.
 # В системе еще нет вопросов.
 >>> Question.objects.all()
 []
 # Создайте новый Вопрос.
 # Поддержка временных зон включена в файле настроек по умолчанию, поэтому
 # Django ожидает дату с tzinfo для pub_date. Используйте timezone.now()
 # вместо datetime.datetime.now() и он сделает правильное дело.
 >>> from django.utils import timezone
 >>> q = Question(question_text="Что нового?", pub_date=timezone.now())
 # Сохраните объект в базу данных. Вам нужно явно вызвать save()
 >>> q.save()
 # Теперь у него есть ID. Обратите внимание, что вместо "1" может быть "1L", в зависимости
 # на которую базу данных вы используете. Это не большая проблема; это просто означает, что ваша
 # Бэкенд базы данных предпочитает возвращать целые числа в виде длинных целых чисел Python
 # objects.
 >>> q.id
 1
 # Доступ к значениям поля модели через Python атрибуты.
 >>> q.question_text
 "What's new?"
 >>> q.pub_date
 datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
 # Измените значения, изменив атрибуты, затем вызовите save().
 >>> q.question_text = "What's up?"
 >>> q.save()
 # objects.all() показывает все вопросы в базе данных.
 >>> Question.objects.all()
 [<Question: Question object>]

Здесь нужно подождать一会儿. <Question: Question object> это просто бесполезное представление этого объекта. Давайте решим эту проблему: редактируя модель Question (в файле polls/models.py) и добавляя метод __str__() к этим моделям Question и Choice:

Содержимое файла polls/models.py следующим образом:
 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
from django.db import models
 from django.utils.encoding import python_2_unicode_compatible
 @python_2_unicode_compatible # только если вам нужно поддерживать Python 2
 class Question(models.Model):
     # ...
     def __str__(self):
         return self.question_text
 @python_2_unicode_compatible # только если вам нужно поддерживать Python 2
 class Choice(models.Model):
     # ...
     def __str__(self):
         return self.choice_text

Добавление метода __str__() очень важно, использование интерактивного подсказчика для добавления в модель не только упрощает процесс для вас, но и полезно для автоматического генерирования управления Django.

Внимание, это все нормальные методы Python. Давайте добавим пользовательский метод, это просто демонстрация: polls/models.py

 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
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() - datetime.timedelta(days=1)

Обратите внимание, что здесь добавлены import datetime и from django.utils import timezone для использования стандартного модуля datetime Python и полезных программ Django для работы с временными зонами в django.utils.timezone. Если вы не знакомы с обработкой временных зон в Python, вы можете прочитать  Документация по поддержке временных зон.

Сохраните эти изменения и запустите еще раз python manage.py shell для запуска нового интерактивного shell Python:

 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
>>> from polls.models import Question, Choice
 # Убедитесь, что наша функция __str__() работает.
 >>> Question.objects.all()
 [<Question: Что происходит?>]
 # Django предоставляет богатый API поиска в базе данных, который полностью управляется
 # аргументы ключевых слов.
 >>> Question.objects.filter(id=1)
 [<Question: Что происходит?>]
 >>> Question.objects.filter(question_text__startswith='What')
 [<Question: Что происходит?>]
 # Получите вопрос, опубликованный в этом году.
 >>> from django.utils import timezone
 >>> current_year = timezone.now().year
 >>> Question.objects.get(pub_date__year=current_year)
 <Вопрос: Что нового?>
 # Запрос на ID, которое не существует, вызовет исключение.
 >>> Question.objects.get(id=2)
 Traceback (последний вызов в начале):
     ...
 DoesNotExist: Вопрос, соответствующий запросу, не существует.
 # Поиск по основному ключу является наиболее частым случаем, поэтому Django предоставляет
 # краткий способ выполнения точного поиска по основному ключу.
 # Следующее идентично Question.objects.get(id=1).
 >>> Question.objects.get(pk=1)
 <Вопрос: Что нового?>
 # Убедитесь, что наша пользовательская функция работает.
 >>> q = Question.objects.get(pk=1)
 >>> q.was_published_recently()
 True
 # Дайте Вопросу несколько Вариантов. Вызов create создает новый
 # Объект Choice, выполняет операцию INSERT, добавляет вариант в набор
 # Количество доступных вариантов и возвращает новый объект Choice. Django создает
 # Набор для хранения "второй стороны" связи ForeignKey.
 # (например, вариант вопроса) который можно получить через API.
 >>> q = Question.objects.get(pk=1)
 # Отобразить любые варианты из связанного набора объектов -- пока что нет.
 >>> q.choice_set.all()
 []
 # Создать три варианта.
 >>> q.choice_set.create(choice_text='not much', votes=0)
 <Выбор: не так много>
 >>> q.choice_set.create(choice_text='The sky', votes=0)
 <Выбор: Небо>
 >>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)
 # Объекты Выбора имеют доступ к своим связанным объектам Вопроса через API.
 >>> c.question
 <Вопрос: Что нового?>
 # и vice versa: Объекты Вопроса получают доступ к объектам Выбора.
 >>> q.choice_set.all()
 [<Выбор: не так много>, <Выбор: Небо>, <Выбор: Just hacking again>]
 >>> q.choice_set.count()
 3
 # API автоматически следит за отношениями до необходимого уровня.
 # Используйте двойные подчеркивания для разделения отношений.
 # Это работает на таком глубине, на каком вам нужно; нет ограничений.
 # Найдите все Choices для любого вопроса, дата публикации которого в этом году
 # (переиспользуя переменную 'current_year', которую мы создали выше).
 >>> Choice.objects.filter(question__pub_date__year=current_year)
 [<Выбор: не так много>, <Выбор: Небо>, <Выбор: Just hacking again>]
 # Удалите один из вариантов. Используйте delete() для этого.
 >>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
 >>> c.delete()

Обзор Django management

Создание администратора

Сначала нам нужно создать пользователя, который может входить в интерфейс управления. Запустите следующую команду:

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

Введите желаемое имя пользователя (любое), затем нажмите Enter.

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

Затем, вам будет предложено ввести адрес электронной почты (любой):

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

Последним шагом является ввод пароля. Он требует ввода пароля дважды,第二次 для подтверждения первого.

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

Запуск разработочного сервера

Дefault Django admin site is activated. Давайте запустим разработочный сервер и исследуем его.

Если сервер не работает, запустите его, как показано ниже:

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

Теперь, откройте веб-браузер, перейдите в «/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 : ru.oldtoolbag.com
# Date : 2020-08-08
from django.contrib import admin
 from models import Question
 admin.site.register(Question)

Просмотрите функции управления

Теперь, мы зарегистрировали Question, Django знает, что он должен быть отображен на главной странице администратора:

Нажмите «Вопросы». Теперь, на странице «change list» проверьте вопросы. Эта страница показывает все вопросы в базе данных и позволяет выбрать один для изменения. Также мы создали следующие вопросы:

Нажмите на вопрос «Что нового?» для редактирования:

Следующие моменты необходимо учитывать:

 

Формы автоматически генерируются из модели Question.

 

Разные типы полей (DateTimeField, CharField) соответствуют соответствующим HTML-элементам ввода. Каждый тип поля знает, как он отображается в Django-администраторе.

Каждое поле DateTimeField получает JavaScript-快捷方式和弹出日 календарь. Дата получает快捷方式和弹出日历 «Сегодня» и несколько раз快捷方式和弹出窗口, который показывает часто используемые временные значения.

Измените «Дата опубликования», нажмите на快捷ные方式和 «Сегодня» и «Теперь». Затем нажмите «Сохранить и продолжить редактирование» и затем нажмите «История» в правом верхнем углу. Вы увидите страницу, которая перечисляет все изменения, внесенные через Django в этот объект, с именем пользователя и временем изменения:   Загрузка кода:  http://pan.baidu.com/s/1jGR3wDg