Skip to main content
 首页 » 编程设计

python之如何在 django rest 框架中不区分大小写地匹配 url

2025年02月15日30飞鱼

我在 urls.py 中有这一行

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

(?i) 应该使正则表达式不区分大小写。我怀疑它实际上是在不区分大小写的情况下进行搜索,但它传递的命名组 datasource 大小写完好无损,这会导致查找失败。

如何在命名组或查找字段通过之前将其小写?

请您参考如下方法:

我使用(优秀的)Django Rest Framework 文档解决了这个问题,特别是 here

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

 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 

然后,您可以在需要应用自定义行为的任​​何时候简单地将此混合应用到 View 或 View 集。

 class RetrieveUserView(MultipleFieldLookupMixin, generics.RetrieveAPIView): 
     queryset = User.objects.all() 
     serializer_class = UserSerializer 
     lookup_fields = ('account', 'username') 

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

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 添加到该文件的顶部,并将详细 View 更改为 class OdbcConfigDatasourceDetail(CaseInsensitiveLookupMixin, generics.RetrieveUpdateDestroyAPIView):

感谢 DRF 团队出色的文档。