Django字段查询处理

时间:2013-01-15 00:21:12

标签: django ember.js django-views django-rest-framework

我目前正在编写一个项目,在后端使用Django w / Django-Rest-Framework,在前端使用Ember.js / Ember-data。

我希望以这种格式将查询从我的ember应用程序传递回我的django api

http://myurl.com/application/api/model/?parameter=X

其中parameter是要查询的模型上的字段,X是要搜索的值。

像这样松散的东西应该是生成的查询

queryset = Model.objects.filter(**request.QUERY_PARAMS.dict())

其中QUERY_PARAMS.dict()是Django语法,它提供格式的字典

{parameter:X}

**将dict转换为Django所期望的关键字参数 因此,上述行有效:

queryset = Model.objects.filter(parameter=X)

我已经使用自定义视图和自定义mixin工作但是我担心我的查询处理实现可能有点天真,这让我感到非常普遍。

我想知道是否有Django或者某些Django内部的库我还没有完全理解,如果没有我的自定义查询集代码,我会处理这些相对常见的查询?

任何指向正确方向的人都会非常感激。

史蒂夫凯恩

编辑:

  def get_integer_queryset(self, query, queryset):
    #stringify the first entry in query.keys (query is request.QUERY_PARAMS)
    query_key = str(query.keys()[0])
    #split the string into individual strings since the request object dict 
    #contains only a string of numbers and not an actual array (see below)
    #query = {'parameter':'1,2,3,4'} becomes {'parameter':['1','2','3','4']}
    query_values = query.get(query_key, None).split(",")
    #construct two dicts.  One handles integers and the other handles "null"
    #all the code below is required because Django does not seem to handle "null"
    #as a valid query to a field that is type "integer"
    #as a side note, I think this is poor and create annoying work...i would love
    #to be wrong here
    #the Q objects are required in order to compose a query of both integers and 
    #the string "null" 
    query_vals_no_null = {query_key+"__in": []} 
    optional_null_dict = {}
    for value in query_values:
      if value == "null" or value == "None":
        optional_null_dict[query_key+"__isnull"] = True
      else:
        query_vals_no_null[query_key+"__in"].append(value)
    return queryset.filter(  Q(**query_vals_no_null) | 
                             Q(**optional_null_dict)   )

这是我从处理整数查询的自定义视图中获取的主要方法。我插入了评论以澄清正在发生的事情。让我知道这是否有帮助或看起来熟悉/可怕/令人敬畏/有些温和的好看。

史蒂夫

1 个答案:

答案 0 :(得分:2)

django-filter(和REST框架相应的基于django-filter的filter backend)确实是最接近你想要的开箱即用的应用程序,但正如你所发现的那样并不完全支持您需要的用例,特别是因为:

  • 它不支持查询字符串中的null / None个键。
  • 它不支持使用逗号分隔的__in样式查找。

(我对上述任何一个/两个都可能是错的,但这就是我从环绕源/文档看起来的样子)

这意味着你的选择可能是:

  1. 编写您自己的过滤,以完全符合您的需要。
  2. 将上述两个问题的支持提交给django-filter
  3. 查找alternative filtering app并使用它,可能将其包装在REST框架过滤器后端中,以便在任何所需视图中使用它。
  4. 我认为(3)中的任何选项都不会满足您的需求,尽管您可能希望快速了解tastypie和活塞,看看它们是否提供了满足您需要的过滤实现,并且如果有的话,那就是基础。

    还有alternate filter solution for REST framework的关闭拉取请求,看起来它确实支持您__in样式过滤。如果这看起来像你需要的话,那么值得对票证进行评论,我们可以考虑重新打开它,以便在REST框架中提供另一个过滤后端。 (理想情况下,作为第三方过滤后端。)

    如果您已经开始使用自己的过滤器解决方案,并最终得到更全面的内容,那么值得在REST framework group上提及它,以便其他人可以使用它,所以我们可以考虑是否值得将它们整合到一个更容易重复使用的第三方软件包中。

    通过更新编辑此问题,让我知道你是如何进入群组的。