Tastypie DB级别字段选择

时间:2015-04-25 07:19:04

标签: python django api orm tastypie

鉴于PostgreSQL 9.2.10,Django 1.8,python 2.7.5和django-tastypie 0.12.1:

我试图弄清楚如何根据自定义参数(字段选择)为tastypie做一个动态查询集,最终用户可以通过以下方式过滤:

https://example.com/api/v1/resource/?fields=field1(列表视图)
https://example.com/api/v1/resource/1/?fields=field1(详细视图)

def dehydrate()(不使用):
dehydrate 中实施此功能很好,但由于数据已经脱水'我获得的唯一收益是,由于删除了未选择的字段,响应的尺寸更小。此HERE的代码。

def full_dehydrate()(目前正在使用):
full_dehydrate 中实施此功能更好,因为我正在跳过最初的脱水'在我没有选择的字段上。这比上面的 dehydrate 方法更快,更有效。此HERE的代码。

这两种方法虽然没有在db级别实现过滤器(我仍在执行model.objects.all())。这在我的db MORE 的开发实例中可能比应用程序/ api本身可能是本地的,但是在prod(在我的情况下)db在单独的服务器上。所以我的问题是,有没有一种方法可以根据API请求中传递的参数动态更改给定资源的tastypie查询过滤器? get_object_list看起来很有希望,但我不确定这是否是追求的方法,或者我是否应该编写自定义过滤器以通过build_filters添加(我假设build_filter更好,虽然每个例子我看看自定义构建过滤器由于某种原因也需要appy_filter。)。此外,我不确定特定情况的样子,因为用于获取请求参数的方法是bundle.request,这在这两种方法中不存在。

感谢任何花时间阅读本文的人,并非常感谢任何提供有效解决方案的人。我非常感谢给出答案背后的帮助和思考过程。

** 编辑1 **
HERE 是对此过滤器需要发生的过程的良好可视化(希望这有助于激发一些想法)

** TL; DR **
我想允许基于最终用户在API请求中使用的自定义参数(如果未使用Tastypie应该正常运行)的tastypie resrouce查询集的数据库级别过滤(读取:动态修改资源查询集)。

1 个答案:

答案 0 :(得分:1)

似乎您想在生成的Django SELECT子句上设置特定字段。要实现这一点,您需要使用Django的queryset中的only()defer()方法。使用一个或另一个取决于您的需求。

现在,您需要在访问项目之前在查询集上调用该方法。在这种情况下,Tastypie Resource的saab是无用的,因为它与查询集的build_filters()将接收的参数有关。 filter()听起来不错,但我不会把它放在那里,因为我们不是修改过滤(apply_filters())而是选择(WHERE)。最后,我会在SELECT电话后obj_get_list()进行相应的修改。

我正在为您提供符合您需求的要点HERE。正如要点中所解释的那样:

  

这必须分两部分完成:

     

1)在数据库选择的模型查询集中。这需要在某些代码部分   查询集已准备好但仍未评估的位置。 apply_filters()obj_get_list非常适合Tastypie GET请求。

     

2)在obj_get方法中,防止Tastypie从模型中获取所有字段。

您提出的full_dehydrate要点似乎没有必要,因为dehydrate()已经只选择了所选字段。

注意:对于记录,在查询集上使用full_dehydrate()only(),稍后尝试访问模型上的未选择字段会导致单个SQL调用要求额外的字段。所以要小心,总是选择所需的字段,特别是在对象列表中,因为不这样做会生成n * m次调用n后来访问的未选定字段的数量和m查询的对象数量。这是defer() Gist修改的理由。