質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

6100閲覧

django-filterで検索用パラメータを受け取り加工してから検索する方法

KoukoMatsumoto

総合スコア41

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/06/14 13:26

Python 3.6系
Django REST framework 最新
django-filter 最新
Postgresql 10系
上記の構成で開発をしております。

django-filterで、ユーザーが検索条件に入れた値を加工してから検索をしたいのですが、方法はありますでしょうか?

以下の情報を見ましたが、思うようにいきません。
http://www.django-rest-framework.org/api-guide/filtering/
https://django-filter.readthedocs.io/en/master/ref/filters.html#method

イメージとしては、

python

1class UserFilter(FilterSet): 2 name = CharFilter(method='filter_name') 3 def filter_first_name(self, queryset, name, value): 4 if name == "": 5 last_name = "ななし太郎" 6 else: 7 last_name = "苗字" 8 return queryset.filter(last_name + value)

かなり適当なコードですが、このようなものでユーザーの引数をプログラム内で加工し、検索条件に渡せるのかと考えていました。(イメージなので、細かな間違いは見逃してください)

こういった、ユーザーからの引数を加工するやり方につき、もし、何か知見がある方がおりましたらお教え願えますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ご提示されてる django-filterのドキュメントに書いてあるやり方でうまくいきませんでしたか?

class F(FilterSet): """Filter for Books by if books are published or not""" published = BooleanFilter(field_name='published_on', method='filter_published') def filter_published(self, queryset, name, value): # construct the full lookup expression. lookup = '__'.join([name, 'isnull']) return queryset.filter(**{lookup: False}) # alternatively, it may not be necessary to construct the lookup. return queryset.filter(published_on__isnull=False) class Meta: model = Book fields = ['published']

提示されたコードだと、method名と実際のメソッドが名が一致してないのと、queryset.filterに渡す内容が適切でないので動かないとは思います。

name = CharFilter(method='filter_name') # filter_first_name にしないと動かない def filter_first_name(self, queryset, name, value): if name == "": last_name = "ななし太郎" else: last_name = "苗字" return queryset.filter(last_name + value) # Djangoではこういうfilterはかけられない

投稿2018/07/21 14:04

tell_k

総合スコア2120

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KoukoMatsumoto

2018/07/25 08:10

返信いただきましてありがとうございます。なるほどです・・・。名前を変えてオリジナルに指定することなどはできないのですね。納得いたしました。 その中で内容を交換していくしかなさそうですね。 要件に合った使い方ができそうか、検討したいと思います。 お忙しい中本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問