Мне нужно добавить строки запроса в 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)),
]
Вот варианты, которые я изучил:
Использование фильтров поиска:
В 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.
Добавить router.register(r'', view.AccountViewSet, basename='account)
к urls.py
затем переопределите либо get_queryset
, либо retrieve()
, что означает, что мне нужно добавить logi c для обработки двух вариантов использования, получения учетной записи с использованием параметров пути и получения учетной записи с user_id в строке запроса.
Добавить настраиваемое действие с шаблоном регулярного выражения. С этим у меня все равно будет 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
Итак, как лучше всего справиться с этим?