django过滤器查询参数冲突



我正试图通过查询参数从链接过滤db,看起来像这样:

{{url}}/api/books?author="XXX"&from=2003&to=2051&acquired=true

我已经处理了作者和获得的参数,但我被从和到困住了。我的filter.py看起来像这样:

class BookFilter(django_filters.FilterSet):
author = django_filters.CharFilter(field_name="authors__fullname", lookup_expr="icontains")
from = django_filters.NumberFilter(field_name="published_year", lookup_expr="gte")
to = django_filters.NumberFilter(field_name="published_year", lookup_expr="lte")
acquired = django_filters.BooleanFilter(field_name="acquired")
class Meta:
model = Book
fields = [
"author",
"from",
"to",
"acquired"
]

我正在寻找一种方法来分配这些查询参数而不覆盖关键字(from和to),这显然是一个糟糕的主意。

您不需要定义特殊的BookFilter类。这个任务可以简单地在视图级别上完成。只要定义一个dateffilter类来根据日期进行过滤,等等可以在视图级别实现按名称搜索或按价格订购等类型的过滤器。(确保您的模型有一个created_at字段).下面是一个例子

from django_filters import rest_framework as rest_filters
from apps.yourappname.models import YourModel
from django_filters import rest_framework as rest_filters

class DateFilter(rest_filters.FilterSet):   
created_at = rest_filters.DateFromToRangeFilter()
class Meta:
model = YourModel
fields = ['created_at']
class YourAPIView(ListAPIView):
serializer_class = YourModelSerializer
filter_backends = [filters.SearchFilter, filters.OrderingFilter, 
rest_filters.DjangoFilterBackend, ]
filter_class = DateFilter
search_fields = ['authors__fullname' ]
ordering_fields = [ 'created_at', ]
def get_queryset(self):
dataset_queryset = 
YourModel.objects.filter(id=self.request.user.id)
return dataset_queryset

当你按日期过滤时,你的URL看起来像这样:http://127.0.0.1:8000/api/yourappname/id/文件/? created_at_after = 2022 - 04 - 19, created_at_before = 2022-05-28

对于可能有同样问题的人:我设法创建了一个解决方案,其中我创建querydict的副本,pop() "from"one_answers";to"值,并将其分配给新创建的"from_date"one_answers";to_date"钥匙。

最新更新