我正在尝试提供我们的API,以便在我们的ID查找中使用LTE和GTE过滤功能。但是,我们拥有的ID是字母数字,如AB:12345
,AB:98765
等。我试图使用Django-Filter在视图集上执行以下操作:
class MyFilter(django_filters.FilterSet):
item_id = AllLookupsFilter()
class Meta:
model = MyModel
fields = {
'item_id': ['lte', 'gte']
}
但问题是,如果我查询为:http://123.1.1.1:7000/my-entities/?item_id__gte=AB:1999
或http://123.1.1.1:7000/my-entities/?item_id__lte=AB:100
,则无法准确返回ID大于1999
或小于100
的项目plotLines
因为过滤器会将ID作为字符串,并尝试按每个字符进行过滤。任何想法如何实现所以我可以过滤ID,所以我得到的项目确实大于/小于数字ID(忽略初始字符)?
答案 0 :(得分:2)
您要做的是编写自定义查找。您可以在此处详细了解它们:https://docs.djangoproject.com/en/2.0/howto/custom-lookups/
下面的代码示例包含您定义自己的所有内容,但实际功能除外。对于该示例的该部分,请检查链接。
from django.db.models import Lookup
@Field.register_lookup
class NotEqual(Lookup):
lookup_name = 'ne'
在查找中,您需要拆分字符串,然后根据您自己的参数进行搜索。这可能需要您执行以下操作之一:
您要完成的任务通常称为自然排序,并且在SQL方面往往很难做到。有一个很好的技巧,在这里解释得很好:https://www.copterlabs.com/natural-sorting-in-mysql/然而,SQL世界中的亮点很简单: