我正在用django-tastypie编写一个API。使用查询字符串筛选对象的 API。
例如:如果我想查找first_name中有"foo"的客户,我将把这个查询字符串提供给 API 端点进行过滤:
myapi/customers/?first_name__icontains=foo
对于查找名字中有"foo">和姓氏中有"bar"的客户:
myapi/customers/?first_name__icontains=foo&last_name__icontains=bar
我想找到名字或姓氏中有"foo"的客户。但我不知道在查询字符串中指定 OR 过滤器的最佳方法是什么。
一个选项:我可以在查询字符串中使用||
并在服务器端解析它,如下所示,但我不知道这是一种首选方法:
myapi/customers/?first_name__icontains=foo||last_name__icontains=foo
我看到了使用查询字符串过滤结果的 API,但我没有找到任何在查询字符串中进行 OR 过滤的相关文章。这种做法有错吗?如果没有;
在查询字符串中使用 OR 语句的最佳方法是什么?
注意:django-tastypie 使用__icontains
在数据库中进行类似的搜索,忽略它:
last_name__icontains=foo
等于 SQL 中的last_name ilike '%foo%'
。
我没有任何关于 tastypie 的经验,但是,使用 Q https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-object 在 django 中做或查询。
因此,无论在 tastypie 中允许您定义返回的查询的任何地方。
Customer.objects.filter(Q(first_name__icontains='foo') | Q(last_name__icontains='bar'))
注意:如果对象匹配两个参数,则将返回此对象两次。如果这是一个问题,请使用 .distinct()。但是,这是一个昂贵的数据库。