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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Q&A

0回答

874閲覧

django rest api クエリパラメータでのフィルタでSelect a valid choiceとなる

ikasoumen

総合スコア110

Django

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

0グッド

0クリップ

投稿2020/03/06 13:41

編集2020/03/06 14:02

前提・実現したいこと

  • python3.6
  • Django3.0.4
  • Django REST framework

発生している問題・エラーメッセージ

Django REST frameworkおよびdjango-filterでAPIを開発しており、
以下のようなクエリを投げると、"Select a valid choice."とエラーが発生します。

http://localhost:8000/api/v1/target/?project=TEST-00002

# 400 bad requestが返ります { "project": [ "Select a valid choice. That choice is not one of the available choices." ] }

これは、プロジェクト(project)に関係している人(target)というデータモデルを表現していて、
TEST-00002に属している人はいますか?の問いに対して、
そんなprojectはないよと返ってきてしまいました。

一意に特定する意図(登録や変更など)ではなく、
フィルタであるため、単純に0件であることを示してほしいと思っています。

これをスマートに直すことは可能でしょうか?

どうぞよろしくお願いいたします。

補足

本事象が発生する条件を追記します。

親(project)に対象コードが存在し、子(target)には対象コードが存在しない → 0件が返る
親(project)に対象コードが存在せず、子(target)にも対象コードが存在しない → エラー(今回の事象)

定義・テスト

定義や検証結果は、以下の通りになります。

求めている結果としては、
最後のテストケースになります。
(4. http://localhost:8000/api/v1/target/?id=0)

定義

class Target(models.Model): project = models.ForeignKey(Project, db_column='project_number', # DBに作成される列名 to_field='project_number', # 親エンティティの参照列 on_delete=models.CASCADE, null=False, default=None) target_name = models.CharField(max_length=255, null=False, default='') comment = models.TextField(default='', blank=True, null=False) class TargetViewSet(viewsets.ModelViewSet): queryset = Target.objects.all() serializer_class = TargetSerializer filter_backends = (filters.DjangoFilterBackend,) filterset_fields = ['id', 'project'] class TargetSerializer(serializers.ModelSerializer): class Meta: model = Target fields = '__all__' read_only_fields = ('created_at', 'updated_at', 'delete_at')

テストデータ

http://localhost:8000/api/v1/target/

{ "hits": { "total": 2, "next": null, "previous": null, "hits": [ { "id": 1, "project": "TEST-00001", "target_name": "asdfasdfa" }, { "id": 2, "project": "TEST-00001", "target_name": "asdffffffffffffffffff" } ] } }

テストケース

1. http://localhost:8000/api/v1/target/?project=TEST-00002

400 bad requestが返る

# 400 bad requestが返ります { "project": [ "Select a valid choice. That choice is not one of the available choices." ] }

2. http://localhost:8000/api/v1/target/?project=TEST-00001

TEST-00001のデータが表示される。とくに問題ない

{ "hits": { "total": 2, "next": null, "previous": null, "hits": [ { "id": 1, "project": "TEST-00001", "target_name": "asdfasdfa" }, { "id": 2, "project": "TEST-00001", "target_name": "asdffffffffffffffffff" } ] } }

3. http://localhost:8000/api/v1/target/?id=1

1件のデータとして結果が返る。とくに問題ない。

{ "hits": { "total": 1, "next": null, "previous": null, "hits": [ { "id": 1, "project": "TEST-00001", "target_name": "asdfasdfa" } ] } }

4. http://localhost:8000/api/v1/target/?id=0

0件のデータとして結果が返る。とくに問題ない。
ただ、projectの指定でエラーとなっているのに、idがエラーとならないのは、一貫性がない感じがする

{ "hits": { "total": 0, "next": null, "previous": null, "hits": [] } }

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問