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/
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円)