Веб-программирование → Модели и Базы данных в Django
Голова болит. Но все равно напишу эту статью.
В Django используется так называемый ORM чтобы хранить данные в БД. ORM - это такая штука, которая облегчает жизнь разработчика, избавляя его писать нудные SQL запросы. А вместо них предлагает работать с обычными классами, объектами и методами.
Хочешь создать запись в таблице БД? Создай один объект и вызови метода save() И все готово! Классно, да?
Цикл статей про Django:
1. Создаем веб-приложение на Django 3.0.6
2. Основы Django фреймворка
3. Статические файлы (js, css, картинки) в Django
4. Расширение html-файлов в Django
5. Регистрация в Django
6. Модели и Базы данных в Django
1. Модели
Для каждой таблицы в Django нужно создать Модель - класс унаследованный от класса Model из пакета django.db.models. Для каждой модели нужно указать его поля и их тип. Django на каждое поле создаст столбец в таблице БД. С помощью этих моделей мы будем добавлять данные в БД, изменять их и получить обратно.
Попробуем создать функционал по работе с контактами. Пусть у наших контактов будет: Имя, Email, Мобильный номер и Рабочий номер.
Модели обычно описываются в файле models.py. Создайте файл models.py в папке вашего приложения(mysite). И в этом файле пропишите:
# coding=utf-8
from django.db import models
class Contact(models.Model):
name = models.CharField(max_length=255, verbose_name=u"Имя")
email = models.EmailField(null=True, blank=True)
mobile = models.CharField(max_length=255, verbose_name=u"Мобильный номер", null=True, blank=True)
work = models.CharField(max_length=255, verbose_name=u"Рабочий номер", null=True, blank=True)
def __str__(self):
return self.name
Для всех полей нужно указать тип. Здесь у нас два типа CharField - для хранения текста и EmailField тоже для хранения текста, но позволяет хранить только правильные емейлы. У CharField обязательно надо указывать max_length - насколько длинной может быть строка записанная здесь. verbose_name - Как будет отображаться это поле в админке или в формах. null - разрешено ли БД сюда ничего не записывать. blank - разрешено для в формах ничего не заполнять.
Как видно, у нас все поля, кроме name, не обязательные.
Метод __str__ вызывается когда объект переводится в строку. Например при печати. Наш класс Контакт, будет показывать только свое имя.
2. Миграции
После изменения моделей, нужно создать Миграцию БД. Это такие файлы, в которых записано что нужно в БД изменить. А потом эти миграции можно применять к БД.
для создания миграций нужно вызвать команду makemigrations:
python manage.py makemigrations mysite
в конце мы указали mysite. Это приложение, в котором изменены модели. Замените его на название своего приложения.
После этого вы должны увидеть что-то такое:
Migrations for 'mysite':
mysite/migrations/0001_initial.py
- Create model Contact
Django создал файл 0001_inital.py в папке migrations. Посмотрите, если интересно, но не меняйте его.
Теперь мы должны применить эту миграцию в нашу БД. Это делается командой migrate:
python manage.py migrate
Если у вас не было БД, то она сначала создастся. А потом применятся миграции.
Ок. Теперь БД готова, и там есть таблица Контактов.
3. Запросы в БД
Чтобы поработать с моделями(создать, удалить, выбрать) мы откроем Django shell. для этого вызовем команду shell:
python manage.py shell
У вас откроется питоновская командная строка:
Python 2.7.10 (default, Jul 15 2017, 17:16:57)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
Три стрелки >>> это приветствие для ввода команды. Их не надо вводить.
Здесь мы находимся в окружении нашего проекта и можем работать с моделями. Для начала сделаем импорт моделей. Напишите:
>>> from mysite.models import *
Теперь напишите Сontact и в ответ должны увидеть такое:
>>> Contact
<class 'mysite.models.Contact'>
это значит что класс Contact доступен и мы можем с ним работать. Через этот класс мы будем создавать контакты, менять их и запрашивать из БД.
Сначала создадим один контакт: Darth Vader, vader@gmail.com. +0899288333. Объект модели можно создать как обычные объекты:
>>> contact = Contact()
мы создали объект класса Contact и сохранили в переменной contact. Теперь контакту присвоим все его поля:
>>> contact.name = "Darth Vader"
>>> contact.email = "vader@gmail.com"
>>> contact.mobile = "+0899288333"
Выведем contact на экран, для этого просто напишите contact и вы должны увидеть:
>>> contact
<Contact: Darth Vader>
Теперь сохраним этот контакт в БД. Это очень просто:
>>> contact.save()
Все, теперь контакт Дарта Вейдера у нас в БД. Только не звоните ему, он злой.
Модели можно создавать еще таким образом:
>>> han = Contact(name="Han Solo", email="solohan@mail.com", mobile="+0933222442")
>>> han.save()
Теперь в БД два контакта. Можете создать еще несколько.
Попробуем их обратно взять из БД. Введите:
>>> Contact.objects.all()
и Увидите Список всех контактов:
<QuerySet [<Contact: Alisher>, <Contact: Darth Vader>, <Contact: Han Solo>]>
Мы можем отсюда получить контакт по индексу:
>>> contacts = Contact.objects.all()
>>> vader = contacts[1]
>>> print(vader.name)
Darth Vader
Выведем имена и почты всех контактов в цикле: Не забывайте про отступы. Чтобы выйти из цикла, введите пустую строку:
>>> for contact in Contact.objects.all():
... print(contact.name, contact.email)
...
И получим:
(u'Alisher', u'masteraalish@gmail.com')
(u'Darth Vader', u'vader@gmail.com')
(u'Han Solo', u'solohan@mail.com')
Если у вас python 3, то у вас "u" не будет.
Мы можем отфильтровать контакты, при получении из БД:
>>> Contact.objects.filter(name__contains="l")
Контакты, у которых имя содержит строку "l".
>>> Contact.objects.filter(mobile__startswith="+0")
А это контакты, у которых мобильный номер начинается с +0
Методы all() и filter() возвращают список контактов. Из этого списка мы можем получить один контакт по индексу.
Также есть метод get(), который работает также как filter(), но возвращает только один контакт. А если контактов, которые подходят под условия, больше одного, то метод get() закончится с ошибкой. Попробуем:
>>> Contact.objects.get(name="Aayla")
будет ошибка
DoesNotExist: Contact matching query does not exist.
А теперь введите:
>>> Contact.objects.get(name="Han Solo")
И получите контакт Хана Соло. Давайте теперь этот контакт сохраним в переменную:
>>> contact = Contact.objects.get(name="Han Solo")
Теперь контакт удалим:
>>> contact.delete()
Контакт Хана Соло удален. Запросите все контакты из БД и убедитесь в этом.
Вот так вот поработали с БД. Завтра продолжу и покажу как вывести список контактов на сайт и как их там создавать и удалять.