python - 如何在django中的过滤器类中设置后端过滤器范围

标签 python django django-rest-framework django-filter

我正在使用 DRF 构建 REST API。我正在使用 django_filters 来过滤结果集。在一个API中,我希望用户发送他的坐标(纬度,经度),并在后端创建一个范围(纬度+2到纬度-2)并返回结果,我不想从用户那里获取范围字段。所以我可以轻松地更改后端的范围。

我在过滤器类中创建了两个范围过滤器,工作正常,但网址如下所示:/posts/?latitude_min=22&latitude_max=28&longitude_min=80&longitude_max=84。在这里用户负责决定范围。我希望用户仅发送纬度和经度,我决定最大和最小范围。

class PostFilter(django_filters.FilterSet):
    latitude = django_filters.RangeFilter(field_name='latitude')
    longitude = django_filters.RangeFilter()

    class Meta:
        model = Post
        fields = ['latitude', 'longitude', 'country', 'state', 'district', ]

最佳答案

我认为你可以使用“MethodFilter”,如下所示:

from django.db.models import Q

class PostFilter(django_filters.FilterSet):
    latitude = django_filters.MethodFilter(action="filter_latitude")
    longitude = django_filters.MethodFilter(action="filter_longitude")

    class Meta:
        model = Post
        fields = ['latitude', 'longitude', 'country', 'state', 'district']

    def filter_latitude(self, qs, value):
        try:
            return qs.filter(Q(latitude__gte=value-2)&Q(latitude__lte=value+2))
        except BaseException:
            return qs 

    def filter_longitude(self, qs, value):
        try:
            return qs.filter(Q(longitude__gte=value-2)&Q(longitude__lte=value+2))
        except BaseException:
            return qs 

关于python - 如何在django中的过滤器类中设置后端过滤器范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57844524/

相关文章:

python - 如何在 ModelSerializer 的 create 方法中实现 update_or_create

python - 在整数字段的 django-rest-framework 验证器中强制整数类型

python - 添加 "status light"到 Django admin

python - 调试与 EC2、Ubuntu 和 Django 断开的连接

django - Django 运行多线程或多进程吗?

python - Django 休息 + Jinja2 : ValueError: dictionary update sequence element #0 has length 0; 2 is required

python - 使用 Excel 工作表中的数据在 Python 中绘制图表

python - 获取 Python Decimal 的精确十进制字符串表示?

python - 将字符串拆分为子字符串

python - matplotlib savefig bbox_inches = 'tight' 不忽略不可见轴