鉴于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查询集的数据库级别过滤(读取:动态修改资源查询集)。
答案 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修改的理由。