0

私はtastypieを使用していますが、問題が発生しました。

私の問題:

ユーザーはメッセージを投稿でき、他のユーザーがそのユーザーにサブスクライブしている場合は、ホームページでそれらのメッセージを見ることができます。Twitterユーザーがツイートしたり、フォロワーがツイートを見たりするのとまったく同じです。

すべてのメッセージのパブリック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モデルに保持することです(どのユーザーが、別のジョイントモデルを介してモデル内の再帰的なManyToMany関係としてどのユーザーにサブスクライブされているか)。

次に、URLを介してサブスクリプションをパラメーターやフィルターとして指定しなくても、リソースを介してこれを公開できます。代わりに、リソースの基本クエリセットは次のようになります。

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

selfモデルにManyToManyRelationshipがある場合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 に答える