具有复杂查询的REST API

时间:2013-01-29 17:16:20

标签: django backbone.js

我不完全了解如何在后端使用REST API进行复杂查询,以及在前端使用骨干网络应用程序。假设我有一个与user表有关系的user_group表:

user.group_ref => user_group.id

如果我在GET上执行/api/v1/user/1/?format=json,它会执行SELECT * FROM users WHERE id = 1之类的操作。好的,好的,现在......如果我希望JOIN user_group user.group_ref = user_group.id user_group可以立即访问{{1}}上的数据。我不想做额外的查询去获取那些数据。

也许我把整个想法弄错了......有更简单的方法吗?

3 个答案:

答案 0 :(得分:1)

REST是一组约定。它不提供自动查询映射,因此您需要定义服务端点,然后实现它以返回您想要的任何内容。

在您的情况下,组成URL的典型方式如下:

GET /groups/(groupid)/users

也就是说“给我属于这个群组的所有用户”。可替换地:

GET /users?group=(groupid)

哪种风格不那么“RESTful”,但不会不必要地将群组推广为顶级资源。

无论哪种方式,Backbone都不提供OOTB方式来填充来自更复杂资源的集合。对于除简单CRUD之外的任何事情,您必须自己实施服务调用,或者创建一个单独的只读集合,其url映射到您的服务。类似的东西:

var UserGroupCollection = Backbone.Collection.extend({
  url: function() { return "groups/" + this.options.groupId + "/users"; }
});

var group = new UserGroupCollection({groupId:1});
group.fetch();

答案 1 :(得分:0)

REST API可以单独实现,与前端没有任何关系,可以根据需要进行设计。

在您的情况下,如果您总是要获得带有用户查询的user_group.id,那么您应该永久地将SQL更改为JOIN语句:SELECT * FROM users WHERE id = 1 JOIN user_group WHERE user.group_ref = user_group.id。

如果您需要包含和不包含user_group信息的查询。您可以设计两个REST方法,例如(GET / api / v1 / user / 1?format = json)用于没有组信息,(GET / api / v1 / userwithgroup / 1?format = json)用于具有组信息的方法

在Backbone上,你可以有两个不同的模型来代表这两个。

如果表中没有数百万用户,那么带有组信息的SQL应该非常快,并且总是可以随身携带组信息。

答案 2 :(得分:0)

有一个名为slubmber(http://slumber.in/)的python库,它建立在REST API明确目的的请求之上。