2012-07-11 117 views
0

即時通訊使用tastypie我剛碰到一個問題。Tastypie - 查詢集或過濾器

我的問題:

用戶可以發佈消息,如果其他用戶訂閱的用戶,他們可以看到自己的主頁的消息。它的完全像twitter用戶推特和追隨者看他們的推文。

我有一個公共API的所有消息。
我可以使用?userid=1

爲解決問題的過濾特定用戶的消息:使用
?userid__in=1&userid__=5&...


我可以篩選多個用戶消息(並且因此解決問題)但是,這不是一個好的方法,因爲URL長度將增加到可能不允許的數量。 (2000個字符)

有沒有更好的方法來做到這一點?
有沒有辦法可以使用request.user查詢集做一個連接?
或者我應該使用某種高級過濾

謝謝!

回答

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成爲巨大的與人訂閱了很多用戶的問題。您可以做的是將這些信息保存在數據庫模型中(該用戶通過單獨的聯合模型訂閱哪個用戶作爲模型內的遞歸ManyToMany關係)。

然後,您可以通過您的資源公開此信息,而無需通過URL將訂閱指定爲參數和/或過濾器。相反,在資源的基礎查詢集將是:

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

前提是你必須在你的User模型self ManyToManyRelationship。看看herehere

1

如果有人通過user_ids的列表,他們希望看到更新,然後對其進行過濾,該怎麼辦?事情是這樣的:

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

然後在你的代碼會轉換到這一點的實際列表,以及查詢:

Message.objects.filter(user__id__in=user_ids)

+0

謝謝!任何想法如何使用tastypie做到這一點? – nknj 2012-07-11 21:02:47

+2

不,但它看起來像這會給你一個很好的起點:http://django-tastypie.readthedocs.org/en/latest/cookbook.html#per-request-alterations-to-the-queryset – girasquid 2012-07-11 21:08:10

+0

感謝girasquid ! – nknj 2012-07-11 21:11:30