前提・実現したいこと
- 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": [] } }
あなたの回答
tips
プレビュー