pj100-team / part-time-tutorial

新しくアルバイトに入った方向けの研修チュートリアル
3 stars 0 forks source link

質問! 検索機能の実装をうまくできません #48

Closed nishishimakenya closed 1 year ago

nishishimakenya commented 1 year ago

:bug: バグの概要

todoapp/filters.py

import django_filters from .models import Task

class TaskFilter(django_filters.FilterSet): class Meta: model = Task fields = { "title": ["exact", "icontains"], "deadline": ["exact", "lte", "gte"], }

これで検索機能を実装しようとしているのですが上手くいきません エンドポイントを  http://127.0.0.1:8000/api/tasks/?title=あいうえお として、「あいうえお」というタスクのみを表示したいのですが全てのタスクが表示されてしまいます

:cyclone: バグの再現手順と発生環境

Django-restframework を用いています

GET /api/tasks/?=%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A

HTTP 200 OK Allow: GET, POST, HEAD, OPTIONS Content-Type: application/json Vary: Accept

[ { "id": 10, "title": "あいうえお", "deadline": "2023-08-03T15:50:00Z", "memo": "これを検索", "sub_tasks": [] }, { "id": 11, "title": "かきくけこ", "deadline": "2023-08-18T16:01:00Z", "memo": "これは表示しない", "sub_tasks": [] } ]

「かきくけこ」を表示しないようにしたいのですが表示されます

:memo: 調べたこと

views.py を直接編集する方法もあるらしく、その手順でしてみましたが同様の結果でした

class TaskListCreateView(generics.ListCreateAPIView): queryset = Task.objects.all().order_by("deadline") # 締切順に整列 serializer_class = TaskSerializer filterset_class = TaskFilter # 検索機能追加

def get_queryset(self):
    queryset = Task.objects.all()
    title = self.request.query_params.get('title', None)
    if title is not None:
        queryset = queryset.filter(book__title__icontains=title)
    return queryset
umepon0626 commented 1 year ago

pdb(デバッガ)を使ってget_querysetメソッドのtitle = self.request.query_params.get('title', None)がNoneになっていないかを確認してください。

nishishimakenya commented 1 year ago

def get_queryset(self): queryset = Task.objects.all() import pdb; pdb.set_trace() title = self.request.query_params.get('title', None) if title is not None: queryset = queryset.filter(titleicontains=title) return queryset で操作したところ /Users/nishishimakenya/chapter4/todolist/todoapp/views.py(31)get_queryset() -> title = self.request.query_params.get('title', None) となり、Noneにはなりませんでした ですが他のコードの記述部分にミスがあり、それを修正すると正しく表示されました( set = queryset.filter(booktitleicontains=title) を set = queryset.filter(titleicontains=title) に修正)

views.py を直接編集する方法ではうまくいきましたがfilters.py を用いる方法では上手くいきません

umepon0626 commented 1 year ago

よかったです。

title = self.request.query_params.get('title', None)

これはpdbの次の行を示しているだけだから、その後にtitleって打ち込んでenter押したら、中身見れるよ。 ここは伝わりにくいかもだから、FB面談のときに一緒にやろう。

俺も基本viewsを直接編集してるから、filter使ったことないんよねぇ

nishishimakenya commented 1 year ago

(Pdb) title *** NameError: name 'title' is not defined と表示されました 了解です、filters.py は使わずにviews.py の直接編集で行きます あとテストコードのエラーがなくなればchapter4完成ですので明日には終わると思います

umepon0626 commented 1 year ago

金曜日じゃあ、FB面談やろうか。