下記リクエストで3件の結果を得たい。
GET /api/v1/incident/?id=1,2,3
models.py
from django.db import models
class Auther(models.Model):
author_name = models.CharField()
class Book(models.Model):
book_name = models.CharField()
book_author = models.ForeignKey(Auther)
serializers.py
from rest_framework import serializers
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
views.py
from rest_framework import viewsets
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = serializers.BookSerializer
filterset_class = filters.BookFilter
filters.py
from django.db.models import Q
from django_filters import rest_framework as filters
class MultiValueFilter(filters.Filter):
def __init__(self, *args, **kwargs):
self.lookup_expr = kwargs.pop('lookup_expr')
super(MultiValueFilter, self).__init__(*args, **kwargs)
def filter(self, queryset, value):
q = Q()
url_args = value.split(',') if value else []
for arg in url_args:
q = q | Q(**{self.lookup_expr: arg})
return queryset.filter(q)
class BookFilterFilter(filters.FilterSet):
id = MultiValueFilter(lookup_expr='id__exact')
class Meta:
model = models.Book
fields = '__all__'
検索条件 | 説明 |
---|---|
exact | 完全一致 |
iexact | 大文字小文字を区別しない完全一致 |
contains | 指定の値を含む |
icontains | 大文字小文字を区別しない指定の値を含む |
startswith | 指定の値で始まる |
istartswith | 大文字小文字を区別しない指定の値で始まる |
endswith | 指定の値で終わる |
iendswith | 大文字小文字を区別しない指定の値で終わる |
gt | 指定の値より大きい |
gte | 指定の値以上 |
lt | 指定の値より小さい |
lte | 指定の値以下 |
in | 与えられたリストまたはタプルのいずれかの値と一致 |
range | 指定の範囲内の値と一致 |
year | 日付フィールドの年と一致 |
month | 日付フィールドの月と一致 |
day | 日付フィールドの日と一致 |