gpt4 book ai didi

Django 字段查询处理

转载 作者:行者123 更新时间:2023-12-02 02:07:23 25 4
gpt4 key购买 nike

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

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

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

其中参数是被查询模型上的一个字段,X 是要搜索的值。

像这样松散的东西应该是结果查询
queryset = Model.objects.filter(**request.QUERY_PARAMS.dict())

其中 QUERY_PARAMS.dict() 是提供格式字典的 Django 语法
{parameter:X}

** 将 dict 转换为 Django 所期望的关键字参数。
因此,上面的行是有效的:
queryset = Model.objects.filter(parameter=X)

我已经使用自定义 View 和自定义 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) )

这是我从处理整数查询的自定义 View 中获取的主要方法。我插入了评论以澄清正在发生的事情。让我知道这是否有帮助或看起来很熟悉/可怕/很棒/有点奇怪。

史蒂夫

最佳答案

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

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

  • (我可能对上述任何一个/两个都错了,但从源代码/文档的角度来看,这就是我的看法)
    这意味着您的选择可能是:
  • 编写您自己的过滤以完全按照您需要的方式运行。
  • 对以上两个问题的支持贡献给 django-filter .
  • 寻找 alternative filtering app ,并使用它,可能会将其包装在 REST 框架过滤器后端中,以便更轻松地跨任何所需 View 使用。

  • 我认为 (3) 中的任何选项都不能满足您的需求,尽管您可能想快速深入研究一下美味派和活塞,看看它们是否提供了满足您需要的过滤实现,并建立了一些基础如果有的话。
    还有一个针对 alternate filter solution for REST framework 的封闭拉取请求,看起来确实支持你 __in样式过滤。如果这似乎可以满足您的需求,那么值得对票证发表评论,我们可以考虑重新打开它,以便在 REST 框架中提供另一个过滤器后端。 (理想情况下作为第 3 方过滤器后端。)
    如果您继续像已经开始那样使用自己的过滤器解决方案,并最终得到更全面的解决方案,那么值得在 REST framework group 上提及它。 ,所以其他人可以使用它,所以我们可以考虑是否值得将它整合到一个更容易重复使用的第 3 方包中。
    通过使用更新编辑此问题,让我知道您在小组中的进展情况。

    关于Django 字段查询处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14329206/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com