0

我写了一个基于 Django 的 ORM 的 REST API。这是我的 REST API 的一些示例

curl "http://example.com/api/pcserver?last_update__lt=2012-06-01 00:00:00&hostname__startswith=xen"

在服务器端,我使用一个queryset.filter()函数来处理所有GET参数,并将结果queryset转换为 a json,然后返回给用户。

现在我无法将此 API 转换为基于 Web 的搜索表单。

我想对这个神奇的搜索表单有什么:

  1. 使用javascript动态添加/删除查询参数,使用它们加入AND(我不需要OR在这些参数之间)
  2. 提供下拉菜单以根据模型选择要搜索的字段
  3. 支持选择运算符,例如__lt, __gt,__regex

那里有没有轮子,所以我不必重新发明它?谢谢:-)

4

3 回答 3

1

@yegle

我建议使用这种媒体类型:http ://code.ge/media-types/collection-next-json/它是以下内容的扩展:http ://amundsen.com/media-types/collection/format/媒体类型,您可以毫无问题地实现您的目标。

看这个文件:

{"collection": {
  "version": 1.0,

  "queries": [
    {
      "href":    "http://service.com/my-resource", 
      "rel":     "search", 
      "prompt":  "Enter search string", 
      "data" : [
        {
          "name": "query",
          "prompt": "Search query",
          "required": true
        }, {
          "name":   "gender",
          "prompt": "Gender",
          "list":   {
            "default": "female",
            "options": [
              {"value": "female", "prompt": "Female"},
              {"value": "male",   "prompt": "Male"}
            ]
          }
        }
      ]
    }
  ]  

}}

使用“查询”数组,您可以描述几个可以轻松转换为 HTML 表单的搜索模板。在每个查询对象中,您可以定义:

  • 搜索 URI
  • “表格”的标题(即提示);和
  • 具有不同要求的任意数量的查询参数。

从上面的示例中可以看到,有两个查询参数——“query”和“gender”,其中“query”参数可以转换为 HTML.input,“gender”参数可以转换为 HTML.select。

我希望我正确理解了您的问题和目标。

于 2012-06-04T10:21:34.727 回答
0

我不确定 django 工具。但是,您可以使用 MYSQL 的全文布尔搜索来实现上述大部分要求。请参考以下链接并回复您的评论!

http://dev.mysql.com/doc/refman//5.5/en/fulltext-boolean.html

于 2012-06-04T10:09:11.583 回答
0

看看django-filter

或者,以某种黑客方式,使用 Django Admin。您可以ModelAdmin为目标模型自定义 a 并使用ChangeList查询字符串处理。以内置User为例:

from django.contrib.admin.options.IncorrectLookupParameters
from django.contrib.admin.views.main import ChangeList
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
self = UserAdmin(User, None) # or taken from admin.site._registry if the model admin is registered
cl = ChangeList(request, User, self.list_display,
             self.list_display_links, self.list_filter, self.date_hierarchy,
             self.search_fields, self.list_select_related,
             self.list_per_page, self.list_max_show_all, self.list_editable,
             self)
# then cl.get_query_set would process querystring and generate the queryset
try:
    cl.get_query_set(request)
except IncorrectLookupParameters:
    'encounter an invalid lookup'
于 2012-06-04T13:42:54.943 回答