English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Д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 в базе данных) и запускают их в базе данных - по сути, синхронизируют изменения в схеме базы данных с использованием моделей.
Теперь让我们进入交互ный 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()
Сначала нам нужно создать пользователя, который может входить в интерфейс управления. Запустите следующую команду:
# 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? Оно не отображается на странице индекса управления.
Есть только одна задача: нам нужно сообщить администратору, что у объекта 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