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 і впевнено керувати вашою базою даних.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ