Django Polls спрощено — гра з API бази даних

Тепер продовжимо:

[

Спрощені голосування 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--------------------------------)

pic

Імпортуйте моделі:

from polls.models import Choice, Question

Отримайте всі запитання:

Question.objects.all()

pic

Створення питання:

# Створюємо нове питання.  
# Підтримка часових поясів увімкнена в стандартному файлі налаштувань, тому  
# 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()  
# ]>

pic

Зачекайте хвилинку. `не є зручним поданням цього об'єкта. Давайте виправимо це, відредагувавши модель 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()

pic

Висновок

API бази даних Django спрощує роботу з базами даних, дозволяючи розробникам взаємодіяти з даними через код Python замість сирого SQL.

З методами, такими як get(), filter() і create(), ви можете легко здійснювати запити, оновлювати та керувати даними у ваших моделях.

Зв'язки між моделями, такі як зв'язок між Question та Choice, автоматично обробляються через ORM Django, що дозволяє інтуїтивно переміщатися та маніпулювати пов'язаними даними.

Чому API бази даних корисне

  1. Простота використання: API абстрагує складнощі SQL, що дозволяє розробникам легко взаємодіяти з базою даних, використовуючи код Python.

  2. Ефективність: воно надає вбудовані методи для поширених операцій з базою даних, таких як отримання, фільтрація, оновлення та видалення записів.

  3. Відносини між даними: Django автоматично керує відносинами між моделями, дозволяючи вам без зусиль отримувати доступ до пов'язаних даних.

  4. Масштабованість: API підтримує складні пошукові запити та операції, що забезпечує можливість задоволення потреб як малих проектів, так і великих застосунків.

  5. Послідовність: працюючи безпосередньо з моделями, ви зберігаєте послідовність між логікою вашого застосунку та його базовою структурою бази даних.

У підсумку, API бази даних Django дає розробникам можливість зосередитись на створенні функцій, а не на управлінні запитами до бази даних, підвищуючи продуктивність і забезпечуючи чистіший, більш підтримуваний код.

Перекладено з: Django Polls Simplified — Playing with the Database API

Leave a Reply

Your email address will not be published. Required fields are marked *