Тепер продовжимо:
[
Спрощені голосування Django — Створення додатку для голосувань
Як створити додаток Django, продовження:
chrisdevcode.medium.com
](/django-polls-simplified-creating-the-polls-app-3117c402157c?source=post_page-----cd5fd70e5946--------------------------------)
Тепер давайте перейдемо до інтерактивної оболонки Python і попрацюємо з безкоштовним API, який надає Django. Щоб викликати оболонку Python, використовуйте цю команду:
python manage.py shell
Як тільки ви потрапите в оболонку, досліджуйте API бази даних:
[
Створення запитів | Документація Django
Веб-фреймворк для перфекціоністів з дедлайнами.
docs.djangoproject.com
](https://docs.djangoproject.com/en/5.1/topics/db/queries/?source=post_page-----cd5fd70e5946--------------------------------)
Імпортуйте моделі:
from polls.models import Choice, Question
Отримайте всі запитання:
Question.objects.all()
Створення питання:
# Створюємо нове питання.
# Підтримка часових поясів увімкнена в стандартному файлі налаштувань, тому
# Django очікує datetime з tzinfo для pub_date. Використовуйте timezone.now()
# замість datetime.datetime.now(), і все буде зроблено правильно.
from django.utils import timezone
q = Question(question_text="What's the best MacBook Pro?", pub_date=timezone.now())
# Збережіть об'єкт у базі даних. Потрібно явно викликати save().
q.save()
# Тепер у нього є ID
q.id
# Доступ до значень полів моделі через атрибути Python.
q.question_text
# "What's the best MacBook Pro?"
q.pub_date
# datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc)
# Змініть значення, змінивши атрибути, а потім викликавши save().
q.question_text = "What's the best MacBook?"
q.save()
# objects.all() показує всі питання в базі даних.
Question.objects.all()
# ]>
Зачекайте хвилинку. `не є зручним поданням цього об'єкта. Давайте виправимо це, відредагувавши модель Question (у файлі
polls/models.py) і додавши метод
str()` до обох моделей — Question та Choice:
from django.db import models
class Question(models.Model):
# ...
def __str__(self):
return self.question_text
class Choice(models.Model):
# ...
def __str__(self):
return self.choice_text
Оновлений models.py:
from django.db import models
class Question(models.Model):
"""
Модель, що представляє питання для голосування.
Атрибути:
question_text (CharField): Текст питання.
pub_date (DateTimeField): Дата та час публікації питання.
"""
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("date published")
def __str__(self):
return self.question_text
class Choice(models.Model):
"""
Представляє варіант для питання в опитуванні.
Атрибути:
question (ForeignKey): Питання, з яким цей варіант пов'язаний.
choice_text (CharField): Текст варіанту.
votes (IntegerField): Кількість голосів, які отримав цей варіант.
"""
"""
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
Важливо додавати методи __str__()
до ваших моделей, не лише для вашої зручності при роботі з інтерактивною оболонкою, але й тому, що подання об'єктів використовуються в автоматично згенерованій адміністративній панелі Django.
Також давайте додамо користувацький метод до цієї моделі:
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)
Збережіть ці зміни і знову відкрийте нову інтерактивну оболонку Python, запустивши команду python manage.py shell
:
from polls.models import Choice, Question
# Перевіримо, чи працює наш доданий метод __str__().
Question.objects.all()
# ]>
# Django надає потужне API для запитів до бази даних, яке повністю засноване на
# ключових словах.
Question.objects.filter(id=1)
# ]>
Question.objects.filter(question_text__startswith="What")
# ]>
# Отримуємо питання, яке було опубліковане цього року.
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 (most recent call last):
File "", line 1, in
File "/Users/ca/miniconda3/envs/django-polls/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/ca/miniconda3/envs/django-polls/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
raise self.model.DoesNotExist(
polls.models.Question.DoesNotExist: Question matching query does not exist.
# Пошук за первинним ключем є найбільш поширеним випадком, тому 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 створює
# набір (визначений як "choice_set"), щоб тримати "іншу сторону" зв'язку ForeignKey
# (наприклад, вибір для питання), який можна отримати через API.
q = Question.objects.get(pk=1)
# Відобразимо будь-які варіанти з пов'язаного набору об'єктів — наразі їх немає.
q.choice_set.all()
#
# Створюємо три варіанти.
q.choice_set.create(choice_text="MacBook Pro M1, 2020", votes=0)
q.choice_set.create(choice_text="MacBook Air M1, 2021", votes=0)
c = q.choice_set.create(choice_text="MacBook Pro M4", votes=0)
# Об'єкти Choice мають доступ до своїх пов'язаних об'єктів Question.
c.question
#
# І навпаки: об'єкти Question мають доступ до об'єктів Choice.
q.choice_set.all()
# , , ]>q.choice_set.count()
# 3
# API автоматично слідує зв'язкам, скільки б рівнів це не було потрібно.
# Використовуйте подвійні підкреслення для розділення зв'язків.
# Це працює на будь-яку кількість рівнів; обмежень немає.
# Знайти всі варіанти для будь-якого питання, дата публікації якого в цьому році
# (перезнаючи змінну 'current_year', яку ми створили вище).
Choice.objects.filter(question__pub_date__year=current_year)
# , , ]>
# Давайте видалимо один з варіантів. Для цього використовуйте delete().
c = q.choice_set.filter(choice_text__startswith="JMacBook Pro M4")
c.delete()
Висновок
API бази даних Django спрощує роботу з базами даних, дозволяючи розробникам взаємодіяти з даними через код Python замість сирого SQL.
З методами, такими як get()
, filter()
і create()
, ви можете легко здійснювати запити, оновлювати та керувати даними у ваших моделях.
Зв'язки між моделями, такі як зв'язок між Question та Choice, автоматично обробляються через ORM Django, що дозволяє інтуїтивно переміщатися та маніпулювати пов'язаними даними.
Чому API бази даних корисне
-
Простота використання: API абстрагує складнощі SQL, що дозволяє розробникам легко взаємодіяти з базою даних, використовуючи код Python.
-
Ефективність: воно надає вбудовані методи для поширених операцій з базою даних, таких як отримання, фільтрація, оновлення та видалення записів.
-
Відносини між даними: Django автоматично керує відносинами між моделями, дозволяючи вам без зусиль отримувати доступ до пов'язаних даних.
-
Масштабованість: API підтримує складні пошукові запити та операції, що забезпечує можливість задоволення потреб як малих проектів, так і великих застосунків.
-
Послідовність: працюючи безпосередньо з моделями, ви зберігаєте послідовність між логікою вашого застосунку та його базовою структурою бази даних.
У підсумку, API бази даних Django дає розробникам можливість зосередитись на створенні функцій, а не на управлінні запитами до бази даних, підвищуючи продуктивність і забезпечуючи чистіший, більш підтримуваний код.
Перекладено з: Django Polls Simplified — Playing with the Database API