Лучший способ добавления строк запроса в django rest framework - PullRequest
0 голосов
/ 03 августа 2020

Мне нужно добавить строки запроса в django rest framework, но пока вся информация, которую я прочитал, либо не работает для меня, либо просто не имеет смысла для чего-то простого. Так что мне интересно, каков «официальный» способ или лучшая практика делать что-то?

Конечная точка, которую я использую, - /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_queryset, либо retrieve(), что означает, что мне нужно добавить logi c для обработки двух вариантов использования, получения учетной записи с использованием параметров пути и получения учетной записи с user_id в строке запроса.

  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

Итак, как лучше всего справиться с этим?

1 Ответ

1 голос
/ 05 августа 2020

Ниже приведены миксины и их соответствующий метод url + http

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

Вы используете 3 верхних миксина и вызываете конечную точку для ListModelMixin, просто добавьте его как родительский класс, как показано ниже, и вы готовы go.

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

Ссылка на документы Rest Framework на миксины

Ссылка на фильтр поиска , может оказаться полезным.

...