我在 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 团队出色的文档。
