Django字段查询处理
我目前正在编写一个项目,在后端使用Django w/Django Rest框架,在前端使用Ember.js/Ember-data 我希望以这种格式将查询从我的ember应用程序传递回我的django apiDjango字段查询处理,django,ember.js,django-views,django-rest-framework,Django,Ember.js,Django Views,Django Rest Framework,我目前正在编写一个项目,在后端使用Django w/Django Rest框架,在前端使用Ember.js/Ember-data 我希望以这种格式将查询从我的ember应用程序传递回我的django api http://myurl.com/application/api/model/?parameter=X 其中,parameter是所查询模型上的字段,X是要搜索的值 类似这样松散的内容应该是结果查询 queryset = Model.objects.filter(**request.QUE
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内部代码,可以在没有自定义queryset代码的情况下为我处理这些相对常见的查询
任何指向正确方向的指示都将受到衷心的感谢
史蒂夫凯恩
编辑:
这是从处理整数查询的自定义视图中获取的主要方法。我插入评论以澄清正在发生的事情。让我知道这是否有帮助,或者看起来是否熟悉/可怕/可怕/有点像okish
Steve(以及REST framework相应的基于django过滤器的)确实是最接近您所需的现成应用程序,但正如您所发现的,它并不完全支持您所需的用例,主要原因是:
- 它不支持querystring中的
/null
键None
- 它不支持使用逗号分隔的样式查找中的
\u
django过滤器
如果你继续使用你自己的过滤器解决方案,因为你已经开始做了,并且最终得到了更全面的东西,它就值得一提,所以其他人可以使用它,所以我们可以考虑是否值得把它拉到一个更容易重新使用的第三方包中。
通过编辑此问题并进行更新,让我知道您在小组中的进展情况。这与django的旧管理员文件管理系统类似。但最近,他们增加了验证,以确保只能查询特定的参数。您可能对此感兴趣,也可能不感兴趣(只需将输入与有效的参数键列表进行比较)。Steve django rest framework社区似乎生活在google组中,而不是stackoverflow(无论好坏)。我还没有像你上面提到的那样做任何自定义查询逻辑,但我想在你得到可靠的后端答案后继续,因为我刚刚完成了django rest框架的v1.0 ember数据适配器,这似乎是一个必须具备的功能。我从视图中添加了一个方法片段,以显示我处理查询的方法。此方法仅适用于针对“整数”类型字段的查询。如果相关字段的引用是一个整数(通常是PK),那么它也适用于相关字段。回答得很好。我本来打算推荐django过滤器,但我没有意识到这些限制。该应用在某些方面确实存在不足,需要大量的工作(而且需要有人来领导它——有太多的叉子)。我在工作中经常使用django过滤器,我很惊讶没有更多的人需要类似的功能。@josh-Florian Apolloner是这些天的主要维护者。只要符合要求,他对拉拽请求的反应相当灵敏。只是需要有人来做这项工作如果您有任何长期存在的问题,可能值得一提,该项目最近的活动有所增加。您能否在回答中添加指向github回购协议的链接?我似乎找不到主项目(只是alex的初始回购)。是的,完成了。Alex的回购协议是正确的地方,Florian也有对该回购协议(以及PyPI包)的写入权限。谢谢大家。我将签出建议的选项,老实说,我可能会自己编写一个过滤器/查询套件来处理这些用例,并将代码提供给任何可能从中受益的人。
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) )