根据所提供的特定查询,我实现了以下视图来过滤事务。是否有一种方法可以根据所提供的查询动态地进行筛选,例如,您只希望只查询year和month,甚至希望使用一个查询进行筛选。其余的查询值最终将有一个不应该包含在筛选器中的None值。
class ReportTransactionsFilterAPIView(APIView):
def get(self, request, format=None):
year = self.request.GET.get('year')
month = self.request.GET.get('month')
subcounty = self.request.GET.get('subcounty')
ward = self.request.GET.get('ward')
fromDate = self.request.GET.get('fromDate')
toDate = self.request.GET.get('toDate')
qs = LiquorReceiptTrack.objects.all()
qs = LiquorReceiptTrack.objects.filter(
Q(date_recieved__range=[fromDate,toDate])|
Q(date_recieved__year=year)|
Q(date_recieved__month=month)|
Q(sub_county__iexact=subcounty)|
Q(ward__iexact=ward)
)发布于 2020-06-08 08:33:13
您可以使用django-滤波器作为解决方案。另外,有关更多信息,您可以访问https://www.django-rest-framework.org/api-guide/filtering/
发布于 2020-06-08 08:55:08
只需使用if,为什么在这里使用Q?:
year = self.request.GET.get('year')
month = self.request.GET.get('month')
subcounty = self.request.GET.get('subcounty')
ward = self.request.GET.get('ward')
fromDate = self.request.GET.get('fromDate')
toDate = self.request.GET.get('toDate')
qs = LiquorReceiptTrack.objects.all()
if year:
qs = qs.filter(date_recieved__year=year)
if month:
qs = qs.filter(date_recieved__month=month)
...发布于 2020-06-13 12:49:53
浏览了django-滤波器文档并重构了列表视图:
class TransactionFilter(django_filters.FilterSet):
date_range = DateFromToRangeFilter()
month = django_filters.NumberFilter(field_name='date_recieved', lookup_expr='month')
year = django_filters.NumberFilter(field_name='date_recieved', lookup_expr='year')
date = django_filters.DateFilter(field_name='date_recieved', lookup_expr='exact')
sub_county = django_filters.CharFilter(lookup_expr='icontains')
ward = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = LiquorReceiptTrack
fields = ['date','month','year','date_range','sub_county','ward']
class ReportTransactionsFilterAPIView(generics.ListAPIView):
queryset = LiquorReceiptTrack.objects.all()
serializer_class = ReceiptDetailSerializer
filter_backends = (filters.DjangoFilterBackend,)
filterset_class = TransactionFilterhttps://stackoverflow.com/questions/62257901
复制相似问题