0

我正在使用美味的派,但我遇到了一个问题。

我的问题:

用户可以发布消息,如果其他用户订阅了该用户,他们可以在他们的主页上看到这些消息。就像推特用户发推文和关注者在看他们的推文一样。

我有一个用于所有消息的公共 api。
我可以使用过滤特定用户的消息?userid=1

问题的糟糕解决方案:
我可以使用过滤多个用户消息(从而解决问题)
?userid__in=1&userid__=5&...

但这不是一个好方法,因为 url 长度将增加到可能不允许的数量。(2000 个字符)

有没有更好的方法来做到这一点?
有没有一种方法可以request.user在查询集中使用来进行连接?
还是我应该使用某种高级过滤

谢谢你!

4

2 回答 2

5

Tastypie 已经通过 __in 过滤支持这一点(ORM 支持 Tastypie 的所有内容都会公开,除了否定)。无需编码。

看这里:http ://django-tastypie.readthedocs.org/en/v0.9.11/resources.html#basic-filtering

path/to/api/resource/?user_id__in=1,2,3,4,5,6

但是,如果有人订阅了许多用户,您的 URL 仍然会变得很大。相反,您可以做的是将此信息保存在 DB 模型中(哪个用户订阅了哪个用户,作为模型内的递归多对多关系,通过单独的联合模型)。

然后,您可以通过您的资源公开它,而无需通过您的 URL 指定订阅作为参数和/或过滤器。相反,您在资源中的基本查询集将是:

userids = request.user.subscription_userset.values(id)

前提是您的模型中有selfManyToManyRelationship User。看这里这里

于 2012-07-12T01:15:31.270 回答
1

如果您让某人传递user_ids他们想要查看更新的列表,然后对其进行过滤怎么办?像这样的东西:

URL: your/api/messages.json?user_ids=5,8,10,25

然后在代码中将其转换为实际列表,并查询:

Message.objects.filter(user__id__in=user_ids)

于 2012-07-11T20:44:40.213 回答