首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django Rest框架使用regex路由2件事

Django Rest框架使用regex路由2件事
EN

Stack Overflow用户
提问于 2018-01-30 06:09:45
回答 1查看 2.1K关注 0票数 0

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

就在我的urls.py

代码语言:javascript
复制
# 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框架返回一个空结果。

因此,当给定对象的主键(object_id)时,url将正确地按user_id进行过滤,但不能正确地提供对象的详细视图。(它看起来像是显示详细视图的合适页面,只是缺少对象的数据。)

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

代码语言:javascript
复制
^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框架关于url路由的文档,我觉得我肯定遗漏了一些东西。我的理解是,路由器会根据主键自动为详细视图创建url路由,而且看起来它在URL会议中也是这样做的。是我的正则表达式配置错误,还是别的什么?

EN

回答 1

Stack Overflow用户

发布于 2018-11-02 07:28:16

尝试如下所示:

settings.py

代码语言:javascript
复制
INSTALLED_APPS = [
...
'rest_framework',
'django_filters',
...
]

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

}

serializers.py

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48510823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档