Достаем данные из БД

В этой статье мы предполагаем, что вы уже знаете о моделях данных и как описываются их поля. О моделях можно узнать в статье Модели и поля.

В этой статье мы работаем с моделью данных для блога. Если бы мы хранили данные в таблице Excel, она бы выглядела так:

скриншот


А для Django ORM эта таблица описывается так:

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField()
    published_date = models.DateTimeField()

Эта модель называется Post и у неё есть 4 поля:

  • title — заголовок поста, строка до 200 сиволов
  • text— текст поста, строка произвольной длины
  • created_date — дата и время создания поста, объект datetime
  • published_date — дата и время публикации поста, объект datetime

Достать все

Чтобы достать все данные о постах, нам понадобится objects.all():

posts = Post.objects.all()
print(posts)

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

<QuerySet [<Post: Post object>, <Post: Post object>, <Post: Post object>]>

Это 3 поста из базы данных. Как вы могли заметить, они лежат не в списке, а в QuerySet. Пока не будем вдаваться в подробности что это такое, главное, что им можно пользоваться как списком.

<Post: Post object> — объект поста из базы данных. У него есть заголовок, текст, даты создания и публикации... Всё то, что мы указывали у модели.

Давайте получим первый пост:

print(posts[0])
# <Post: Post object>

Довольно просто. Обратились по индексу, как будто это список — получили первый пост.

Достать данные из объекта

Как достать заголовок, текст и т. д. из <Post: Post object>? Укажем поле, данные из которого хотим получить:

some_post = posts[0]
print(some_post.title)

Заголовок хранится в поле title, вот его мы и указали. Вот что выведется в консоль:

Испытания дрейфующего стратостата. Запуск Рогозина и LoRa в стратосферу

А вот так можно вывести заголовки всех постов:

for post in posts:
    print(post.title)

Вот что выведется:

Испытания дрейфующего стратостата. Запуск Рогозина и LoRa в стратосферу
Telegram. Безлимитный сетевой диск. Бесплатный
13 самых заминусованных статей минувшего года
Почему ['1', '7', '11'].map(parseInt) возвращает [1, NaN, 3] в Javascript?
...

Что читать дальше