Django - 过滤GTE LTE以获取字母数字ID

时间:2018-01-11 19:13:13

标签: python django

我正在尝试提供我们的API,以便在我们的ID查找中使用LTE和GTE过滤功能。但是,我们拥有的ID是字母数字,如AB:12345AB: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:1999http://123.1.1.1:7000/my-entities/?item_id__lte=AB:100,则无法准确返回ID大于1999或小于100的项目plotLines因为过滤器会将ID作为字符串,并尝试按每个字符进行过滤。任何想法如何实现所以我可以过滤ID,所以我得到的项目确实大于/小于数字ID(忽略初始字符)?

1 个答案:

答案 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'

在查找中,您需要拆分字符串,然后根据您自己的参数进行搜索。这可能需要您执行以下操作之一:

  1. 编写可以通过Django传递到查询中的自定义SQL。
  2. 请求包含您正在寻找的子集的大量结果,并通过Python对其进行过滤,仅返回重要位。
  3. 您要完成的任务通常称为自然排序,并且在SQL方面往往很难做到。有一个很好的技巧,在这里解释得很好:https://www.copterlabs.com/natural-sorting-in-mysql/然而,SQL世界中的亮点很简单:

    • 按长度排序
    • 按列值排序第二