3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[ Django REST framework ] で複数条件一致の検索機能

Posted at

はじめに

プログラマーなりたてのタケノコです。
上流工程から担当させてもらえるエンジニアになる事を目標に学習しております。

今回は、研修で苦労した複数条件含む検索の機能実装について説明していきます。自分なりにコードの解説して振り返りとして記事書いていきたいと思います。注意として基礎的なDRFの使用方法について解説はしません。あくまで検索機能の作り方をメインにしています。正直、自信がないので参考程度に見てくださればと幸いです。もし指摘や意見あれば遠慮なくコメントしてほしいです!

さっそく解説していく🧐

まずは使用するモデルやシリアライザなどを作成していきます。

Model

今回、使用するモデルは以下になります。
検索条件として title、name、created_at のフィールドを使用します。

models.py
from django.db import models

class Post(models.Model):
    class Meta:
        db_table = 'post'
        
    title = models.CharField(max_length=100)
    name = models.CharField(max_length=50)
    description = models.TextField()
    created_at = models.DateField(auto_now_add=True)
    updated_at = models.DateField(auto_now=True)

Serializer

serializers.py
from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):

	class Meta:
		model = Post
		fields = '__all__'
		read_only_fields = ['id']

View

以下のコードを見るとわかると思いますが、全データを取得して検索条件(クエリパラメータ)からデータを絞り込んでいく処理となっています。

views.py
from rest_framework import views
from .models import Post
from .serializers import PostSerializer
from rest_framework.response import Response

class PostViewSet(views.APIView):

    # 検索機能はこちら ↓↓↓
    def get(self, request):

        # 投稿された全データ取得
        data = Post.objects.all()

        # 検索条件となるクエリパラメータ取得 ※初期値は空文字にしています
        title = request.GET.get('title', '')
        name = request.GET.get('name', '')
        created_at = request.GET.get('created_at', '')

        # 取得出来るクエリパラメータがある事を条件に全データからフィルターをかける
        if title:
            data = data.filter(title=title)
        if name:
            data = data.filter(name=name)
        if created_at:
            data = data.filter(created_at=created_at)

        # フィルターがかけられたデータをJSON形式に変換してレスポンスを返す
        serializer = PostSerializer(data, many=True)
        return Response(serializer.data)

    # 投稿用の処理
    def post(self, request):
        data = request.data
        serializer = PostSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
        return Response(serializer.data)

以上、検索機能の実装でした。

最後に

実装中にクエリパラメータが(検索項目が)増える事や、検索機能(部分一致、半角⇔全角対応)向上など今後必要になりそうな機能があるな~と思いました。ですので、実装する前に今後の機能追加する見込みがあるのかという事も一応念頭に置いてみてもいいかなと思いました。今後、備忘録という事だけではなく機能追加や保守性などふまえて実装し意味のある記事投稿にしていきたいです。

というわけで簡単ではありますが解説は以上にします。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?