Djangoでデータを取得してみる

データの準備

Bookモデルを作成。

$ vi books/models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    price = models.IntegerField()

    def __str__(self):
        return f"{self.title}({self.price}円)"

マイグレーションを実施。

$ python3 manage.py makemigrations
$ python3 manage.py migrate

データを作成し、

$ mkdir books/fixtures
$ vi books/fixtures/initial_data.json
[
  {"model": "books.book", "pk": 1, "fields": {"title": "book1", "price": 1000}},
  {"model": "books.book", "pk": 2, "fields": {"title": "book2", "price": 2000}},
  {"model": "books.book", "pk": 3, "fields": {"title": "book3", "price": 3000}},
  {"model": "books.book", "pk": 4, "fields": {"title": "book4", "price": 4000}},
  {"model": "books.book", "pk": 5, "fields": {"title": "book5", "price": 5000}}
]

投入。

$ python3 manage.py loaddata initial_data.json

データの取得

全件

「モデル.objects.all()」で全件取得できる。

$ vi books/views.py
from django.http import HttpResponse
from .models import Book

def list_books(request):
    books = Book.objects.all()

    return HttpResponse('<br>'.join(map(str, books)))


http://localhost:8000/books/
f:id:yk5656:20210504024237j:plain

1件

「モデル.objects.getl(カラム名=値)」で1件取得できる。

$ vi books/views.py
from django.http import HttpResponse
from .models import Book

def list_books(request):
    book = Book.objects.get(id=1)

    return HttpResponse(book)

book1(1000円)

プライマリキーの場合は「モデル.objects.get(pk=値)」のようにも指定できる。

Book.objects.get(pk=2)

book2(2000円)

フィルタ

filterで絞り込みができる。

Book.objects.filter(title='book3')

book3(3000円)

gtは「より大きい」

Book.objects.filter(price__gt=3000)

book4(4000円)
book5(5000円)

ソート

昇順

Book.objects.filter(price__gt=3000).order_by('price')

book4(4000円)
book5(5000円)

降順

Book.objects.filter(price__gt=3000).order_by('-price')

book5(5000円)
book4(4000円)

SQL実行

Book.objects.raw('SELECT * FROM books_book')

book1(1000円)
book2(2000円)
book3(3000円)
book4(4000円)
book5(5000円)

Qオブジェクト

Qオブジェクトを使うと、OR検索など、さらに複雑なクエリが書ける。

・・・
from django.db.models import Q
・・・
books = Book.objects.filter(Q(title='book2') | Q(title='book4'))
・・・

book2(2000円)
book4(4000円)