Веб-программирование → Модели и Базы данных в 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()

Контакт Хана Соло удален. Запросите все контакты из БД и убедитесь в этом. 

Вот так вот поработали с БД. Завтра продолжу и покажу как вывести список контактов на сайт и как их там создавать и удалять. 

3112 0
Alisher Alikulov