如何在Django-rest框架中不敏感地匹配url大小写?

2024-06-28 12:23:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在urls.py中有一行

url(r'^(?i)(?P<datasource>[a-z]+)/$', views.OdbcConfigDatasourceDetail.as_view()),

(?i)应该使regex不区分大小写。我怀疑它实际上是在不敏感地搜索case,但它传递的命名组datasource时保持大小写不变,这会导致查找失败。在

如何在命名组或查找字段被传递之前将其小写?在


Tags: pyviewurlasurls命名viewsregex
1条回答
网友
1楼 · 发布于 2024-06-28 12:23:40

我使用(优秀的)Django Rest框架文档,特别是here

例如,如果需要根据URL conf中的多个字段查找对象,可以创建一个mixin类,如下所示:

 class MultipleFieldLookupMixin(object):
     """
     Apply this mixin to any view or viewset to get multiple field filtering
     based on a `lookup_fields` attribute, instead of the default single field filtering.
     """
     def get_object(self):
         queryset = self.get_queryset()             # Get the base queryset
         queryset = self.filter_queryset(queryset)  # Apply any filter backends
         filter = {}
         for field in self.lookup_fields:
             if self.kwargs[field]: # Ignore empty fields.
                 filter[field] = self.kwargs[field]
         return get_object_or_404(queryset, **filter)  # Lookup the object

然后,您可以在需要应用自定义行为的任何时候将这个mixin应用到视图或视图集。在

^{pr2}$

我将此代码添加到我的项目中

class CaseInsensitiveLookupMixin(object):
    """
    Stole majority of this mixin 
    from http://www.django-rest-framework.org/api-guide/generic-views/
    """
    def get_object(self):
        queryset = self.get_queryset()             # Get the base queryset
        queryset = self.filter_queryset(queryset)  # Apply any filter backends
        filter = {self.lookup_field: self.kwargs[self.lookup_field].lower()}

        return get_object_or_404(queryset, **filter)  # Lookup the object

必须将from django.shortcuts import get_object_or_404添加到该文件的顶部,并将详细视图更改为class OdbcConfigDatasourceDetail(CaseInsensitiveLookupMixin, generics.RetrieveUpdateDestroyAPIView):

为DRF团队的优秀文档提供支持。在

相关问题 更多 >