首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个查询参数的动态查询集过滤

问具有多个查询参数的动态查询集过滤
EN

Stack Overflow用户
提问于 2020-06-08 08:22:46
回答 3查看 928关注 0票数 0

根据所提供的特定查询,我实现了以下视图来过滤事务。是否有一种方法可以根据所提供的查询动态地进行筛选,例如,您只希望只查询year和month,甚至希望使用一个查询进行筛选。其余的查询值最终将有一个不应该包含在筛选器中的None值。

代码语言:javascript
复制
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)

        )
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-08 08:33:13

您可以使用django-滤波器作为解决方案。另外,有关更多信息,您可以访问https://www.django-rest-framework.org/api-guide/filtering/

票数 1
EN

Stack Overflow用户

发布于 2020-06-08 08:55:08

只需使用if,为什么在这里使用Q?:

代码语言:javascript
复制
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)
...
票数 0
EN

Stack Overflow用户

发布于 2020-06-13 12:49:53

浏览了django-滤波器文档并重构了列表视图:

代码语言:javascript
复制
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 = TransactionFilter
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62257901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档