【问题标题】:Django Rest Framework Routing 2 things with regexDjango Rest Framework 使用正则表达式路由 2 件事
【发布时间】:2018-01-29 22:09:45
【问题描述】:

我正在使用 Django Rest Framework 视图集和路由器设置 API 端点,我试图让 url 接受两个值:首先,通过 user_id 过滤对象,然后通过对象的 id . (在我的例子中,对象来自一个名为 Request 的模型。)例如,mysite.com/api/requests/1A/ 将返回 user 1A 的所有 Request 对象,mysite.com/api/requests/1A/23/ 将返回 Request 对象和 pk=23 user 1A.

就在我的urls.py

# urls.py

from django.conf.urls import url, include
from rest_framework import routers
from . import views

router = routers.DefaultRouter()
router.register(r'requests/(?P<user_id>.+?)(?=\/)', viewset=views.RequestsByUser, base_name='request')

urlpatterns = [
    url(r'^', include(router.urls)),
]

# views.py

class RequestsByUser(viewsets.ModelViewSet):
    serializer_class = RequestsSerializer

    def get_queryset(self):
        u_id = self.kwargs['user_id']
        return Request.objects.filter(user_id=u_id)

当 url 仅传递 user_id 时,这适用于列出所有 Request 对象。但是当我尝试传递对象的 id 示例时:mysite.com/api/requests/1A/23/,rest 框架返回一个空结果。

因此,该 url 将通过 user_id 正确过滤,但在给定其主键 (object_id) 时无法正确提供对象的详细视图。 (它看起来像是用于详细视图的正确页面,只是缺少对象的数据。)

Django 调试说我的 URLConf 中有以下四种 url 模式:

^api/ ^ ^test/(?P<user_id>.+?)(?=\/)/$ [name='request-list']
^api/ ^ ^test/(?P<user_id>.+?)(?=\/)\.(?P<format>[a-z0-9]+)/?$ [name='request-list']
^api/ ^ ^test/(?P<user_id>.+?)(?=\/)/(?P<pk>[^/.]+)/$ [name='request-detail']
^api/ ^ ^test/(?P<user_id>.+?)(?=\/)/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='request-detail']

我已经多次阅读 Django Rest Framework 文档以了解 url 路由,但我觉得我一定遗漏了一些东西。我的理解是路由器会根据主键自动为详细视图创建 url 路由,看起来它在 URL Conf 中是这样做的。是我的正则表达式配置错误,还是其他原因?

【问题讨论】:

  • 你为什么不使用query_param。通过 django-rest-framework 已经为您的问题准备好了 SearchFilter, Filter 课程

标签: regex django rest django-rest-framework url-routing


【解决方案1】:

试试这样的:

settings.py

INSTALLED_APPS = [
...
'rest_framework',
'django_filters',
...
]

REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),

}

序列化器.py

import django_filters.rest_framework


class MyModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = MyModel
        fields = ('id', 'MyField', 'MyFavoriteField','OtherField')

class MyModelListView(generics.ListAPIView):

    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
    filter_fields = ('id', 'MyField','MyFavoriteField',)

urls.py:

path('service_name/', MyModelListView.as_view(), name="something_name"),

获取: http://localhost:8070/services/service_name/?id=123&MyField=My%20Field%20Value

更多信息:

https://www.django-rest-framework.org/api-guide/filtering/#filtering

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2016-03-30
    • 2020-10-10
    • 2019-01-01
    • 2014-04-14
    • 2012-09-23
    相关资源
    最近更新 更多