【问题标题】:Tastypie - Queryset or filtersTastypie - 查询集或过滤器
【发布时间】:2012-07-11 13:44:48
【问题描述】:

我正在使用 tastypie,但我遇到了问题。

我的问题:

用户可以发布消息,如果其他用户订阅了该用户,他们可以在他们的主页上看到这些消息。它的完全像 twitter 用户发推文和关注者查看他们的推文。

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

问题的错误解决方案:
我可以使用
?userid__in=1&userid__=5&...

过滤多个用户的消息(从而解决问题)

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

有更好的方法吗?
有没有办法可以在 queryset 中使用 request.user 进行连接?
或者我应该使用某种高级过滤

谢谢!

【问题讨论】:

    标签: django tastypie


    【解决方案1】:

    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)
    

    前提是您的User 模型中有self ManyToManyRelationship。看看herehere

    【讨论】:

      【解决方案2】:

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

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

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

      Message.objects.filter(user__id__in=user_ids)

      【讨论】:

      猜你喜欢
      • 2011-10-27
      • 2018-01-12
      • 2022-12-05
      • 2016-04-12
      • 2019-07-29
      • 1970-01-01
      • 2014-06-12
      • 2012-03-29
      • 2018-11-27
      相关资源
      最近更新 更多