JavaRush /Курсы /Модуль 3: Django /Работа с базой данных через Django Shell

Работа с базой данных через Django Shell

Модуль 3: Django
7 уровень , 5 лекция
Открыта

Django shell – это интерактивная оболочка Python, предоставляемая Django. Она позволяет напрямую взаимодействовать с вашим проектом, моделями и базой данных в реальном времени. Это, по сути, Python-консоль, но с подключённым контекстом вашего Django проекта. Через Django shell вы можете:

  • Создавать записи в базе данных.
  • Обновлять существующие записи.
  • Удалять данные.
  • Выполнять запросы к вашей базе данных и проверять их результат.
  • Экспериментировать с логикой ваших моделей.

Django shell – это отличный инструмент для отладки и быстрой проверки идей.

Запуск Django shell

Чтобы открыть Django shell, выполните следующую команду в терминале, находясь в папке с вашим проектом:

python manage.py shell

Если всё в порядке, вы увидете что-то такое:

Python 3.X.X (default, ...)
Django X.X.X
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

Поздравляю! Вы в Django shell. Сейчас мы начнём манипуляции с нашими моделями.

Работа с базой данных через Django shell

Подключение моделей

Первое, что нужно сделать, это импортировать ваши модели. Предположим, мы разрабатываем приложение blog, в котором есть модель Post. Модель Post выглядит так:

# blog/models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=255)
    content = models.TextField()
    published_date = models.DateTimeField(auto_now_add=True)

Импортируем эту модель в Django shell:

from blog.models import Post

Теперь вы можете работать с моделью Post, будто это ваш новый лучший друг.

Создание записей

Создавать записи в базе данных через Django shell очень просто. Давайте добавим первую запись в таблицу Post.

# Создаём новый экземпляр модели
post = Post(title="Мой первый пост", content="Добро пожаловать в мой блог!")

# Сохраняем экземпляр в базе данных
post.save()

После выполнения post.save() ваша запись сохранена в базе данных.

Но есть способ еще короче:

Post.objects.create(title="Второй пост", content="Всё становится проще!")

Команда create() сразу делает инициализацию объекта и сохранение.

Чтение данных

Теперь, когда у нас есть данные, давайте их прочитаем. Для этого используем методы QuerySet:

# Получить все записи
posts = Post.objects.all()
print(posts)

Вы увидите что-то вроде:

<QuerySet [<Post: Post object (1)>, <Post: Post object (2)>]>

Конечно, это не совсем читабельно. Добавим в модель Post метод __str__, который улучшит отображение объектов.

# blog/models.py
class Post(models.Model):
    ...
    def __str__(self):
        return self.title

Теперь в Django shell:

>>> posts = Post.objects.all()
>>> print(posts)
<QuerySet [<Post: Мой первый пост>, <Post: Второй пост>]>

Красота, правда?

Фильтрация данных

Вы можете использовать фильтры для поиска данных:

# Найти записи с определённым названием
post = Post.objects.get(title="Мой первый пост")
print(post.content)

Но будьте осторожны с get. Если он не находит запись или находит больше одной, он вызовет исключение. Чтобы избежать этого, лучше использовать filter:

# Найти записи, содержащие слово "пост"
posts = Post.objects.filter(title__contains="пост")
print(posts)

Фильтрация поддерживает множество специальных операторов, таких как contains, startswith, exact и многие другие. Полный список доступен в документации Django ORM.

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

Чтобы обновить запись, сначала найдём её, а затем изменим нужные поля:

post = Post.objects.get(title="Мой первый пост")
post.content = "Теперь это обновлённый контент!"
post.save()  # Сохраняем изменения

После вызова save() запись в базе данных будет обновлена.

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

Удаление тоже максимально простое:

post = Post.objects.get(title="Мой первый пост")
post.delete()

И всё, запись исчезла из базы данных без следа. Надеюсь, вы были к этому готовы.

Типичные ошибки при работе через shell

  • Ошибка DoesNotExist. Возникает, если метод get() не нашёл запись. Используйте filter или проверьте наличие записи с помощью exists():

    if Post.objects.filter(title="Не существует").exists():
        print("Запись найдена")
    else:
        print("Запись не существует")
    
  • Ошибка MultipleObjectsReturned. Если get() находит больше одной записи, он не знает, какую вернуть. Используйте filter с ограничением:

    post = Post.objects.filter(title="Второй пост").first()
    
  • Забыли вызвать save(). Если вы создали объект и изменили его, но забыли вызвать save(), изменения не сохранятся.

  • Введите правильный путь к модели. Иногда забывают импортировать правильную модель, особенно если ваш проект уже несколько дней развивается, и в приложении больше одной модели.

Практическое задание

Попробуйте выполнить следующие шаги в вашем проекте:

  1. Импортируйте свою модель в Django shell.
  2. Создайте несколько записей в базе данных с различными значениями.
  3. Прочитайте данные с помощью all() и убедитесь, что они отображаются корректно.
  4. Найдите одну из записей с помощью filter или get, измените её и сохраните.
  5. Удалите одну из записей и убедитесь, что она больше не существует.

Эти упражнения помогут вам освоить основные операции через Django shell и уверенно управлять вашей базой данных.

1
Задача
Модуль 3: Django, 7 уровень, 5 лекция
Недоступна
Чтение данных из базы
Чтение данных из базы
1
Задача
Модуль 3: Django, 7 уровень, 5 лекция
Недоступна
Обновление и удаление данных
Обновление и удаление данных
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ