【问题标题】:Best practice way of adding querystrings in django rest framework在 django rest 框架中添加查询字符串的最佳实践方法
【发布时间】:2020-08-03 19:17:30
【问题描述】:

我需要向 django rest 框架添加查询字符串,但到目前为止,我阅读的所有信息要么对我不起作用,要么对简单的事情没有意义。所以我想知道,做事的“官方”方式或最佳实践是什么?

我使用的端点是/account?user_id=1。我的 urls.py 设置如下:

router = routers.SimpleRouter(trailing_slash=False)
router.register(r'account', view.AccountViewSet)
urlpatterns = [
    path('', include(router.urls)),
]

这些是我探索过的选项:

  1. 使用搜索过滤器:

    AccountViewSet 中,我设置了以下内容:

    from rest_framework.filters import SearchFilter
    .
    .
    .
    class AccountViewSet(mixins.CreateModelMixin,
                        mixins.RetrieveModelMixin,
                        mixins.UpdateModelMixin,
                        viewsets.GenericViewSet):
      filter_backends = (SearchFilter, )
      search_fields = ['user_id']
    .
    .
    .
    

    有了这个我得到一个 405,Method \"GET\" not allowed.

  2. router.register(r'', view.AccountViewSet, basename='account) 添加到urls.py 然后覆盖get_querysetretrieve() 这意味着我必须添加逻辑来处理两个用例,使用路径参数获取帐户并在查询字符串。

  3. 使用正则表达式模式添加自定义操作。有了这个,我仍然有router.register(r'', view.AccountViewSet, basename='account)。然后在我的视图中我有:

    @action(detail=False, url_path='(?P<user_id>[^/.]+)')
        def get_user_id(self, request, user_id=None):
            .
            .
    

    这也可以,但我遇到的问题(这似乎不对)是当我点击我的端点/account?user_id=1 时,user_id 参数被设置为“帐户”而不是 1

那么处理这个问题的最佳实践是什么?

【问题讨论】:

  • 你想完成什么?检索具有给定用户 ID 的所有帐户?或者只获取给定用户的一个唯一帐户。
  • 是...检索具有给定用户 ID 的所有帐户

标签: django django-rest-framework


【解决方案1】:

下面是 mixins 和它们各自的 url + http 方法

| Mixin              | Endpoint       | Method |
|--------------------|----------------|--------|
| CreateModelMixin   | /account/      | POST   |
| RetrieveModelMixin | /account/<id>/ | GET    |
| UpdateModelMixin   | /account/<id>/ | POST   |
| ListModelMixin     | /account/      | GET    |

您正在使用前 3 个 mixin 并调用 ListModelMixin 的端点,只需将其添加为父类,如下所示即可。

class AccountViewSet(mixins.ListModelMixin,
                    mixins.CreateModelMixin,
                    mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin,
                    viewsets.GenericViewSet,
):

mixins 上的 Rest Framework 文档参考

Search filter reference你可能会发现它很有用。

【讨论】:

  • 谢谢@avikki。出于某种原因,我一直在查看 ListModelMixin。 PS,您没有在答案示例中包含它。
猜你喜欢
  • 2021-10-15
  • 1970-01-01
  • 2014-04-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多