
前回はobjectsメソッドでデータを取得する方法を教えてもらったね

今回は続きで、filter()の使い方を解説していくね!
filter()とは
前回は
- objectsというモデルマネージャ
- all()などのobjectsのメソッド
について解説しました。
前回紹介したメソッドでは、all()ですべて取り出すか、get()等で1つだけ取得するしか方法がありませんでした。
そこで今回は、filter()というメソッドを使い、複数データを条件で絞り込んで取得する方法を解説したいと思います。
filter()とは簡単に説明すると、オブジェクトの取得の条件を設定し、取得結果を厳選するために使用します。
filter()の使い方
さっそく簡単なfilter()の使い方を見てみましょう。
モデルは前回のものを使用します。
from django.db import models
class Fruit_price(models.Model):
name = models.CharField(max_length=20)
quantity = models.IntegerField()
price = models.IntegerField()
def __str__(self):
return self.name + '_' + str(self.quantity) + '_' + str(self.price)
事前にデータベースに登録をしてあります。

前回使用したget()を使用して、名前=みかんを取得しようとしても、名前=みかんのデータは2つあるため、個数や価格して1つに絞る必要がありました。
今回は、filter()を使用して重複項目があるものを取得してみましょう。
from django.shortcuts import render
from django.views import View
from .models import Fruit_price
class IndexView(View):
def get(self, request):
obj_filter_mikan = Fruit_price.objects.filter(name='みかん').all()
params = {
'filter_mikan': obj_filter_mikan
}
return render(request, 'example_app/index.html', params)
name=’みかん’として、名前がみかんのものを取り出してみました。

もし、名前=みかんの先頭を取り出したければ
obj_filter_mikan = Fruit_price.objects.filter(name='みかん').first()
としたりし、条件を加えていけばいいでしょう。
また、filterはAND検索や、OR検索を行うことができます。
AND検索では、複数のfieldを指定することによってできます。
obj_filter_mikan = Fruit_price.objects.filter(name='みかん', price=100).all

OR検索では、
from django.db.models import Q #重要
obj_filter_mikan = Fruit_price.objects.filter(Q(name='みかん') | Q(name='ばなな')).all()
というように、filter(Q(*field) | Q(*field))と記述することで検索できます

まとめ
以上、2回にわたってObjectsやObjectsメソッドを扱ってきましたがいかがでしたでしょうか。
Djangoでデータベースを扱う上で、最低限の内容だと思いますので、ぜひじっくり理解していただけたらと思います!
filter()の使い方は他にもたくさんあります。
ぜひマスターして、自分なりの使い方を身に着けてください!
コメント